2014-05-09 5 views
1

Je souhaite réexaminer la question comme indiqué dans PYTHONPATH vs. sys.path. Fondamentalement, il est préoccupé par le développement d'un paquet comme:PYTHONPATH vs. sys.path (RELOADED)

Project 
    setup.py 
    package 
     __init__.py 
     lib.py 
     script.py 

En supposant script.py ne from package.lib import foo il ne fonctionne pas lors de l'appel:

python -m package.script 

à partir du répertoire où setup.py est assis, mais pas lors de l'appel (sur les fenêtres, CPython 2.7):

.\package\script.py 

ImportError: No module named package 

En premier cas, lors de l'impression est entrée sys.path premier '', mais dans le second cas, la première entrée est le chemin absolu où script.py est assis. Et bien sûr dans ce cas, il ne sait rien à propos de package et l'importation échoue. Ce sera également le cas lors d'un double-clic dans Explorer.

Le original stackoverflow question recommande l'installation du paquet par setup.py develop. Cependant, dans le setuptools 3.5 actuel (je suis conscient + confondu du renommer de distutils/setuptools) cette option n'est même pas documentée (j'ai setuptools 3.4.x, mais je ne l'ai pas essayé). Procedere est sur windows (pour CPython 2.7 mais aussi avec Python 3 en tête) pour double-cliquer sur le fichier et l'avoir travail. Importations relatives

+0

Pour en savoir plus sur le fonctionnement de sys.path, consultez la réponse http://stackoverflow.com/a/38403654/850326 – djhaskin987

+0

pour l'erreur "no module named": http://stackoverflow.com/questions/23417941/python -import-error-no-module-named-does-exists/40883739 # 40883739 – JinSnow

Répondre

2

La meilleure façon de le faire maintenant est d'utiliser l'installation pip avec l'option -e.

pip install -e . 

Il utilise un répertoire avec le fichier setup.py. Le "." indique ce répertoire. Cela fonctionne de la même manière que la méthode de développement setuptools.

Je crois que le développement crée un lien d'oeuf dans votre dossier de paquets de vue qui pointe vers le dossier de la bibliothèque. http://pythonhosted.org/setuptools/setuptools.html#develop-deploy-the-project-source-in-development-mode

python setup.py develop 

Je crois que c'est la raison pour laquelle vous obtenez le chemin absolu. Il peut y avoir un conflit avec un lien de développement et une installation. Les choses auraient pu aussi être déplacées.

Pour un double-clic, il suffit d'avoir quelque chose qui vérifie sys.argv. S'il n'y a pas de valeur pour sys.argv [1] ajouter build, installer ou développer.

De plus, j'ai toujours entendu dire que vous vouliez importer les modules, puis appeler les fonctions à partir des modules. à partir du paquet import lib. lib.foo() de cette façon, vous savez d'où vient la méthode. Je crois que l'importation fait la même chose dans les deux sens; Cela peut nettoyer votre importation. Python pathing et l'emballage peuvent être une douleur.

from package import lib 
lib.foo() 
+0

J'ai essayé 'develop' et c'est exactement ce que je voulais (fonctionne aussi pour double-cliquer). Inconvénient est qu'il nécessite un 'setup.py' (dont je n'ai pas besoin autrement parce que PyInstaller utilise' .spec'files). Merci d'indiquer l'emplacement dans la documentation 'setuptools'. – nepix32

+0

En ce qui concerne 'pip install -e .': pour moi cela ne fonctionnait pas ** sans ** a' setup.py'. Que voulez-vous dire par: "... n'utilise pas un fichier setup.py, mais un répertoire ..."? – nepix32

+1

@ nepix32 Désolé, j'avais tort. Je voulais dire que vous n'appelez pas directement le fichier setup.py ou les méthodes d'installation. Le répertoire doit avoir un fichier setup.py. – HashSplat

1

Vous pouvez lire attentivement the module search path documentation. Notez que le chemin de recherche inclura "le répertoire contenant le script d'entrée (ou le répertoire courant)". Lorsque vous appelez python -m package.script, le répertoire en cours est utilisé puisqu'il n'y a pas de script d'entrée (script.py est utilisé comme module). Lorsque vous exécutez .\package\script.py, il annonce .\package au chemin de recherche.

Une solution à votre situation consiste à placer tous les scripts exécutables dans le répertoire de base de votre hiérarchie de bibliothèque. C'est à dire.déplacez script.py dans un répertoire.