PYTHONPATH与sys.path(RELOADED)

时间:2014-05-09 12:05:04

标签: python setuptools

我想重新审视PYTHONPATH vs. sys.path中指定的问题。基本上它涉及开发类似的包:

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

假设script.py确实from package.lib import foo,它在调用时可以正常工作:

python -m package.script

来自setup.py所在的目录,但不是在调用时(在Windows上,CPython 2.7):

.\package\script.py

ImportError: No module named package

在第一种情况下,打印sys.path第一个条目是'',但在第二种情况下,第一个条目是script.py所在的绝对路径。当然,在这种情况下,它对package一无所知,导入失败。在资源管理器中双击时也会出现这种情况。

original stackoverflow question建议按setup.py develop安装软件包。但是,在当前setuptools 3.5(我知道+ distutils / setuptools重命名的混淆)这个选项甚至没有记录(我有setuptools 3.4.x,但没有尝试)。

任何人都可以向我指出推荐的内容(" ......唯一明显的方法......")procdere在Windows上(对于CPython 2.7,但也考虑到Python 3)进行双击文件并让它工作。相对进口?

2 个答案:

答案 0 :(得分:2)

现在更好的方法是使用带有-e选项的pip install。

pip install -e .

它使用带有setup.py文件的目录。 “。”表示此目录。这与setuptools develop方法的工作方式相同。

我相信开发工具会在您的视觉包文件夹中创建一个鸡蛋链接,该文件夹指向库的文件夹。 http://pythonhosted.org/setuptools/setuptools.html#develop-deploy-the-project-source-in-development-mode

python setup.py develop

我相信这就是你获得绝对路径的原因。可能与开发链接和安装存在冲突。事情也可能已经发生了变化。

对于双击,只需要检查sys.argv。如果sys.argv [1]没有值,则追加构建,安装或开发。

此外,我一直听说你要导入模块然后从模块中调用函数。从包导入lib。 lib.foo()就是这样你知道方法的来源。我相信导入对两种方式都做同样的事情;这可能会清理您的导入。 Python的路径和包装可能很痛苦。

from package import lib
lib.foo()

答案 1 :(得分:1)

您可能需要仔细阅读the module search path documentation。请注意,搜索路径将包含"包含输入脚本(或当前目录)"的目录。当您调用python -m package.script时,将使用当前目录,因为没有输入脚本(script.py用作模块)。当您运行.\package\script.py时,它会将.\package广告到搜索路径。

您的情况的解决方案是将所有可执行脚本放在库层次结构的基本目录中。即将script.py移到一个目录。