web-dev-qa-db-fra.com

Shebang ne fonctionne pas avec python3

J'ai le programme suivant:

#!/usr/local/bin/python3

print("Hello")

Par le terminal, je fais test.py et je reçois:

Traceback (most recent call last):
  File "/usr/lib/python3.3/site.py", line 629, in <module>
    main()
  File "/usr/lib/python3.3/site.py", line 614, in main
    known_paths = addusersitepackages(known_paths)
  File "/usr/lib/python3.3/site.py", line 284, in addusersitepackages
    user_site = getusersitepackages()
  File "/usr/lib/python3.3/site.py", line 260, in getusersitepackages
    user_base = getuserbase() # this will also set USER_BASE
  File "/usr/lib/python3.3/site.py", line 250, in getuserbase
    USER_BASE = get_config_var('userbase')
  File "/usr/lib/python3.3/sysconfig.py", line 610, in get_config_var
    return get_config_vars().get(name)
  File "/usr/lib/python3.3/sysconfig.py", line 560, in get_config_vars
    _init_posix(_CONFIG_VARS)
  File "/usr/lib/python3.3/sysconfig.py", line 432, in _init_posix
    from _sysconfigdata import build_time_vars
  File "/usr/lib/python3.3/_sysconfigdata.py", line 6, in <module>
    from _sysconfigdata_m import *
ImportError: No module named '_sysconfigdata_m'

Au lieu de cela si je tape python3 test.py cela fonctionne, je reçois:

Hello

P.S. which python3 ----> /usr/local/bin/python3

14
zer0uno

En règle générale, prenez soin de certains pièges:

  1. définir l'indicateur executable sur le script: chmod u+x test.py
  2. essayez de exécuter avec un point précédent "./", appelez donc ./test.py sinon il pourrait exécuter un autre script à partir de votre PATH
  3. assurez-vous également que vous n'avez pas de fins de ligne Windows, cela semble également empêcher l'évaluation de Shebang. Il y a quelques suggestions autour, par exemple. dans cette réponse , sur la façon de convertir le format. 

    Si python3 test.py fonctionne, les fins de ligne de Windows sont probablement votre problème.

  4. #!/usr/bin/env python3 est le meilleur moyen de définir Shebang, car le binaire python peut être installé ailleurs. env inspectera l'environnement PATH pour trouver le binaire

EDIT: Le type d'erreur de l'OP ressemble à des fins de lignes Windows pour moi. Je les ai eu aussi avec des résultats différents

36
DomTomCat

Vous pourriez voir ImportError: No module named '_sysconfigdata_m' parce que /usr/lib/command-not-found est endommagé sur votre système à cause de le bogue ubuntu .

Pour résoudre ce problème, exécutez ./test.py et non pas test.py - le répertoire actuel ne se trouve généralement pas dans $PATH (pour des raisons de sécurité) et vous devez donc spécifier explicitement le chemin, sinon la commande est introuvable, ce qui peut entraîner l’exécution de /usr/lib/command-not-found. la ImportError.

Si ./test.py échoue avec la même erreur, vérifiez qu'il n'y a pas de '\r\v\f' (espaces blancs inattendus) dans Shebang (print(repr(open('test.py', 'rb').readline()))). Si test.py utilise des sauts de ligne Windows, la tentative de recherche de '/usr/local/bin/python3\r' (remarque: '\r' en raison de '\r\n' newline) est susceptible d’échouer et de provoquer l’erreur.

0
jfs