2014-05-09 39 views
1

我想重新访问PYTHONPATH vs. sys.path中指定的问题。基本上,它关注的是开发一个软件包,如:PYTHONPATH与sys.path(RELOADED)

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并不知情,导入失败。在Explorer中双击时也是如此。

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

任何人都可以向我指出什么建议(“...只有这样做的明显方法......”)procedere是在窗口上(对于CPython 2.7,但也有Python 3),双击该文件并让它工作。相对进口?

+0

有关sys.path如何工作的更多信息,请参见http://stackoverflow.com/a/38403654/850326 – djhaskin987

+0

针对“no module named”错误:http://stackoverflow.com/questions/23417941/python -import-error-no-module-named-does-exist/40883739#40883739 – JinSnow

回答

2

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

pip install -e . 

它使用setup.py文件的目录。 “。”表示这个目录。这与setuptools开发方法的工作方式相同。

我相信,开发创建一个鸡蛋链接在你的视线包文件夹指向图书馆的文件夹。 http://pythonhosted.org/setuptools/setuptools.html#develop-deploy-the-project-source-in-development-mode

python setup.py develop 

我相信这就是为什么你的绝对路径。与开发环节和安装可能有冲突。事情也可能已经移动。

对于双击只是有东西,检查sys.argv。如果没有为sys.argv [1]添加构建,安装或开发的值。

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

from package import lib 
lib.foo() 
+0

我试过'develop',并且正是我想要的(也适用于双击)。缺点是它需要'setup.py'(我不需要,因为PyInstaller使用'.spec'文件)。感谢在'setuptools'文档中指出位置。 – nepix32

+0

关于'pip安装-e .':对我来说,它不工作**没有**'setup.py'。你是什​​么意思:“......不使用setup.py,而是一个目录......”? – nepix32

+1

@ nepix32对不起,我错了。我的意思是说你不直接调用setup.py文件或设置方法。该目录必须有一个setup.py文件。 – HashSplat

1

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

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