web-dev-qa-db-fra.com

Comment utiliser PYTHONPATH

Comment puis-je utiliser PYTHONPATH? Lorsque j'essaie d'exécuter un script dans le chemin, le fichier n'est pas Found. Quand je cd au répertoire contenant le script, le script est exécuté. Alors à quoi bon le PYTHONPATH?

$ echo $PYTHONPATH
:/home/randy/lib/python

$ tree -L 1 '/home/randy/lib/python' 
/home/randy/lib/python
├── gbmx_html.py
├── gbmx.py
├── __init__.py
├── __pycache__
├── scripts
└── yesno.py

$ python gbmx.py -h
python: can't open file 'gbmx.py': [Errno 2] No such file or directory

$ cd '/home/randy/lib/python'

Après avoir accédé au répertoire de fichiers, il s’exécute.

$ python gbmx.py -h
usage: gbmx.py [-h] [-b]

Pourquoi ne puis-je pas utiliser le PYTHONPATH?

117
Randy Skretka

Je pense que vous êtes un peu confus. PYTHONPATH définit le chemin de recherche pour importer des modules python, pas pour les exécuter comme vous le essayez.

PYTHONPATH Augmente le chemin de recherche par défaut pour les fichiers de module. Le Le format est le même que PATH du shell: un ou plusieurs répertoires chemins d'accès séparés par os.pathsep (par exemple, les deux points sous Unix ou les points-virgules .__ sous Windows). Les répertoires inexistants sont ignorés en silence.

En plus des répertoires normaux, des entrées individuelles de PYTHONPATH peuvent référez-vous aux fichiers zip contenant des modules Python purs (sous forme source ou compilée .__). Les modules d'extension ne peuvent pas être importés à partir de fichiers zip.

Le chemin de recherche par défaut dépend de l'installation, mais généralement commence par prefix/lib/pythonversion (voir PYTHONHOME ci-dessus). Il est toujours ajouté à PYTHONPATH.

Un répertoire supplémentaire sera inséré dans le chemin de recherche devant PYTHONPATH comme décrit ci-dessus à la section Options d'interface. La recherche path peut être manipulé depuis un programme Python en tant que variable sys.path.

http://docs.python.org/2/using/cmdline.html#envvar-PYTHONPATH

Ce que vous cherchez, c'est PATH. 

export PATH=$PATH:/home/randy/lib/python 

Cependant, pour exécuter votre script python en tant que programme, vous devez également définir un Shebang pour Python dans la première ligne. Quelque chose comme ça devrait marcher:

#!/usr/bin/env python

Et lui donner des privilèges d'exécution:

chmod +x /home/randy/lib/python/gbmx.py

Ensuite, vous devriez pouvoir exécuter simplement gmbx.py de n’importe où.

147
Pedro Werneck

Vous confondez PATH et PYTHONPATH. Vous devez faire ceci:

export PATH=$PATH:/home/randy/lib/python 

PYTHONPATH est utilisé par l'interpréteur python pour déterminer les modules à charger. 

PATH est utilisé par le shell pour déterminer les exécutables à exécuter.

43
Richard

PYTHONPATH n'affecte que les instructions import et non la recherche par l'interpréteur Python de niveau supérieur des fichiers python donnés en tant qu'arguments.

Avoir besoin de PYTHONPATH n'est pas une bonne idée - comme pour tout ce qui dépend de variables d'environnement, il est difficile de répliquer des choses de manière cohérente sur différentes machines. Mieux vaut utiliser des «packages» Python qui peuvent être installés (à l'aide de 'pip' ou distutils) dans des chemins dépendant du système que Python connaît déjà.

Lisez [ http://guide.python-distribute.org/introduction.html - lien brisé] https://the-hitchhikers-guide-to-packaging.readthedocs.org/en/ latest/ - 'Le Guide de l'emballage de l'auto-stoppeur', et aussi http://docs.python.org/2/tutorial/modules.html - qui explique PYTHONPATH et les packages à un niveau inférieur.

31
codedstructure

Je pense que vous êtes mêlés entre PATH et PYTHONPATH. Tout ce que vous avez à faire pour exécuter un "script", c'est que son répertoire parental soit ajouté à votre variable PATH. Vous pouvez tester cela en exécutant

which myscript.py

De même, si myscripy.py dépend de modules personnalisés, leurs répertoires parentaux doivent également être ajoutés à la variable PYTHONPATH. Malheureusement, comme les concepteurs de python étaient clairement sur des médicaments, tester vos importations dans la réplique avec les éléments suivants ne garantira pas que votre PYTHONPATH est correctement configuré pour être utilisé dans un script. Cette partie de la programmation python est magique et on ne peut pas y répondre correctement sur stackoverflow.

$python
Python 2.7.8 blahblahblah
...
>from mymodule.submodule import ClassName
>test = ClassName()
>^D
$myscript_that_needs_mymodule.submodule.py
Traceback (most recent call last):
  File "myscript_that_needs_mymodule.submodule.py", line 5, in <module>
    from mymodule.submodule import ClassName
  File "/path/to/myscript_that_needs_mymodule.submodule.py", line 5, in <module>
    from mymodule.submodule import ClassName
ImportError: No module named submodule
2
W4t3randWind

Avec PYTHONPATH défini comme dans votre exemple, vous devriez pouvoir faire

python -m gmbx

L'option -m permet à Python de rechercher votre module dans les chemins d'accès. Python recherche généralement les modules dans, y compris ce que vous avez ajouté à PYTHONPATH. Lorsque vous exécutez un interpréteur tel que python gmbx.py, il recherche un fichier particulier et PYTHONPATH ne s'applique pas.

0
Tigran Saluev