IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

Problème de syntaxe dans une variable


Sujet :

Python

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2014
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2014
    Messages : 3
    Points : 1
    Points
    1
    Par défaut Problème de syntaxe dans une variable
    Bonjour,

    J'ai entrepris de convertir un petit bot mastodon que j'avais écris en shell en python pour gagner quelques fonctionnalités que propose mastodon.py.

    Je débute en python, et je ne suis pas un grand développeur. Mon bot en shell atteint les 50 lignes et c'est le plus gros script que j'ai écrit jusqu'ici. Son but est de poster des images et de courtes vidéos à intervalles réguliers.
    Je me bats depuis quelques jours avec une erreur me disant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TypeError: can only concatenate str (not "NoneType") to str
    La ligne concernée est celle-ci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    media2 = mastodon.media_post('/home/pi/bot/' + str(T) + '.mp4', mime_type='video')
    J'ai tenté plusieurs modifs, mais je n'arrive pas à m'en sortir.
    Cette variable est sensée contenir les infos d'une vidéo à poster sur mastodon comme c'est prévu dans la doc de mastodon.py:
    https://mastodonpy.readthedocs.io/en...don.media_post
    https://mastodonpy.readthedocs.io/en...t/#media-dicts

    Je vois à peu près ce qui cloche, mais je ne trouve pas de solution permettant de faire fonctionner la commande mastodon.media_post.

    Merci d'avance pour votre aide.

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 273
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 273
    Points : 36 757
    Points
    36 757
    Par défaut
    Salut,

    Commencez par poster un traceback un peu plus complet car la ligne de code montrée ne devrait pas générer cette erreur.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Je ne connais pas mastodon, je peux juste dire que T est probablement None au lieu de 'ma_vidéo' par exemple.
    Recherchez peut-être de ce côté.

  4. #4
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2014
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2014
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    Voilà une vue plus complète du code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
     
    from mastodon import Mastodon
    import time
    import requests 
    import json
    import picamera
     
     
    t = time.strftime('%H:%M', time.localtime())
    T = time.strftime('%d-%m', time.localtime())
     
    camera = picamera.PiCamera()
    camera.resolution = (720, 1280)
    camera.rotation = 270
    camera.start_preview()
    time.sleep(2)
    camera.capture ('/home/pi/mastobot/' + str(t) + '.jpg')
    camera.stop_preview()
     
    image = '/home/pi/mastobot/' + str(t) + '.jpg'
    video = '/home/pi/bot/' + str(T) + '.mp4'
     
    media1 = mastodon.media_post('/home/pi/mastobot/' + str(t) + '.jpg')
    media2 = mastodon.media_post('/home/pi/bot/' + str(T) + '.mp4', mime_type='video')
     
    mastodon.status_post( text, media_ids=[media1,media2] )
    La bonne valeur s'affiche quand je fais print(T).

  5. #5
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 273
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 273
    Points : 36 757
    Points
    36 757
    Par défaut
    Citation Envoyé par Tom23 Voir le message
    Voilà une vue plus complète du code
    reste à poster le traceback de l'erreur correspondante....

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  6. #6
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 461
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 461
    Points : 9 248
    Points
    9 248
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Ce qui est importé, c'est "Mastodon" (avec une majuscule) et non "mastodon". Par ailleurs, la variable "text" n'est pas définie.

    A noter que ces 2 erreurs sont faciles à trouver en utilisant un programme d'analyse de code comme "pylint":

    affiche:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    ...
    test21.py:28:9: E0602: Undefined variable 'mastodon' (undefined-variable)
    ...
    test21.py:31:22: E0602: Undefined variable 'text' (undefined-variable)
    ...
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  7. #7
    Membre chevronné
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2003
    Messages
    1 572
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2003
    Messages : 1 572
    Points : 2 014
    Points
    2 014
    Par défaut
    +1 pour pylint.

    Je m'en sers pour mieux ordonner le code, ajouter les docstrings manquantes mais c'est vrai qu'il scanne aussi les variables et libs du code pour signaler celles qui sont inutilisées ou qui n'existent pas (variables).

  8. #8
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 273
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 273
    Points : 36 757
    Points
    36 757
    Par défaut
    Salut,

    Citation Envoyé par tyrtamos Voir le message
    A noter que ces 2 erreurs sont faciles à trouver en utilisant un programme d'analyse de code comme "pylint"
    Je les avais vue sans pylint, mais le soucis est qu'elles lèvent l'exception NameError et non le "TypeError: can only concatenate str (not "NoneType") to str" rapporté.
    De plus si la ligne concernée était:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    media2 = mastodon.media_post('/home/pi/bot/' + str(T) + '.mp4', mime_type='video')
    çà ne lèverait pas cette erreur.
    Sauf à écrire:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    >>> '/home/pi/bot/' + None + '.mp4'
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    TypeError: can only concatenate str (not "NoneType") to str
    >>>
    qui est différent de:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    >>> '/home/pi/bot/' + str(None) + '.mp4'
    '/home/pi/bot/None.mp4'
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  9. #9
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 677
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 677
    Points : 30 965
    Points
    30 965
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par LeNarvalo Voir le message
    je peux juste dire que T est probablement None au lieu de 'ma_vidéo' par exemple.
    Même dans ce cas, str(T) le convertit en string et la concaténation devient possible.

    Citation Envoyé par Tom23 Voir le message
    Voilà une vue plus complète du code:
    Il existe des opérateurs plus sympa en Python pour créer des chaines avec des éléments variables...
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    image = '/home/pi/mastobot/%s.jpg' % t
    video = '/home/pi/bot/{}.mp4'.format(T)

    De plus il existe aussi os.path.join pour créer des chemins (pratique si certaines parties du chemin sont destinées à varier) => camera.capture(os.path.join("home", "pi", "mastobot", "%s.jpg" % t)).

    Malheureusement rien dans ce que tu nous as montré ne permet de reproduire l'erreur TypeError: can only concatenate str (not "NoneType") to str qui signifie que tu tentes de concaténer une valeur None à une string (comme le montre wiztricks avec un exemple "toto" + None). Sauf que str(None) lui transforme la valeur en string "None" ce qui lui permet d'être concaténée sans souci. Or comme dans ton code tu utilises str() à chaque concaténation de strings, cette erreur ne peut pas y apparaitre.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  10. #10
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2014
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2014
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    Merci pour vos réponses. Je reviens vers vous tardivement parce que je n'ai pas eu le temps de me replonger dans ce projet ces derniers temps.
    Je pense que comme la plupart des débutants je manque de vocabulaire en plus du manque de connaissances en python.


    Voici le code complet. Il est juste imputé de quelques infos personnelles comme des identifiants et des bouts de commandes me permettant de récupérer dans des variables "soleil" et "temp" des infos en json venant d'une instance home assistant.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
     
     
    from mastodon import Mastodon
    import time
    import requests #pour URL Home assistant
    import json
    import picamera
     
     
    '''
    ### A décommenter pour obtenir les tokens à la première utilisation
     
    Mastodon.create_app(
         'pytooterapp',
         api_base_url = 'https://toot.fr',
         to_file = 'pytooter_clientcred.secret'
    )
    '''
     
     
    ### Infos de connexion 
     
    mastodon.log_in(
        'user@user.org',
        'Motdepasse',
        to_file = 'pytooter_usercred.secret'
    )
     
    t = time.strftime('%H:%M', time.localtime())
    T = time.strftime('%d-%m', time.localtime())
     
     
    ### Parse Home assistant
     
    ##Etat du soleil (valeur true ou false)
    soleil = requests.get('http://192.168.168...')
    soleiljson = json.loads(soleil.text)
     
    ##Température abri (nombre à virgule)
    temp = requests.get('http://192.168.168...')
    tempjson = json.loads(temp.text)
     
     
    ### Prise photo
     
    camera = picamera.PiCamera()
    camera.resolution = (960, 1280)
    camera.rotation = 270
    camera.start_preview()
    time.sleep(2)
    camera.capture ('/home/pi/mastobot/' + str(t) + '.jpg')
    camera.stop_preview()
     
     
    ### Evoi du toot
    text = (u"Hello, I'm Koopa ! \nIt\'s " + str(t) + "\nTemp= " + str(tempjson["state"]))
     
    image = '/home/pi/mastobot/' + str(t) + '.jpg'
    video = '/home/pi/bot/last.mp4'
    mimetype = "'mp4'"
     
    media1 = mastodon.media_post('/home/pi/mastobot/' + str(t) + '.jpg')
    media2 = mastodon.media_post(video, mime_type=mimetype)
     
    mastodon.status_post( text, media_ids=media2 )
    Et voilà le message d'erreur obtenu:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Traceback (most recent call last):
      File "bot.py", line 67, in <module>
        media2 = mastodon.media_post(video, mime_type=mimetype)
      File "/home/pi/.local/lib/python3.7/site-packages/decorator.py", line 232, in fun
        return caller(func, *(extras + args), **kw)
      File "/home/pi/.local/lib/python3.7/site-packages/mastodon/Mastodon.py", line 102, in wrapper
        return function(self, *args, **kwargs)
      File "/home/pi/.local/lib/python3.7/site-packages/mastodon/Mastodon.py", line 2494, in media_post
        mime_type)
    TypeError: can only concatenate str (not "NoneType") to str
    Pour moi l'erreur ne vient pas de T puisque sur la version ci-dessus le problème reste le même alors que T n'est pas utilisé et que par ailleurs un print(T) m'affiche bien la valeur désirée.

  11. #11
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 273
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 273
    Points : 36 757
    Points
    36 757
    Par défaut
    Salut,

    Déjà vous pourriez simplifier le problème pour n'avoir que le nécessaire pour faire fonctionner la ligne qui plante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    media2 = mastodon.media_post(video, mime_type=mimetype)
    Après vous pouvez demander au developpeur ce qu'il en pensent (car c'est un problème d'utilisation de mastodon ou un bug de ...)

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

Discussions similaires

  1. Réponses: 1
    Dernier message: 19/04/2013, 11h45
  2. [POO] Probléme de syntaxe dans une classe
    Par jewelz dans le forum Langage
    Réponses: 3
    Dernier message: 03/11/2007, 03h57
  3. Problème d'adresse dans une variable
    Par mick77 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 07/06/2007, 12h41
  4. Probléme pour remplacer = dans une variable
    Par koKoTis dans le forum Scripts/Batch
    Réponses: 18
    Dernier message: 05/06/2007, 13h37
  5. [requête]problème de syntaxe dans une insertion
    Par josua dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 16/05/2007, 08h50

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo