我的pythonpath有问题
我知道这个问题可能有点傻,但我真的搞不懂。我之前的文件夹结构是这样的:
-src
|
-module.py
-program.py
在这个结构下,我可以从程序中引用模块,一切都很顺利。
但我后来把文件夹结构改成了这样:
-src
|
-__init.py
-module.py
|
-programDir
|
-__init.py
-program.py
现在,当然,我无法从程序中访问模块了。我该如何把src当作一个包来引用呢?我尝试在src目录下创建一个
__init__.py
文件,但没有成功。
更多细节:我在program.py中尝试过的导入语句:
import module
还有
from src import module
第一个在模块和程序在同一个目录时是可以用的。
我遇到的错误是:
ImportError: No module named module
顺便说一下:不,我的模块和程序并不是叫module或者program。
更新:我在program.py文件中尝试了这个:
from ...src import module
还有
from ..src import module
这两个都给我返回了:
ValueError: Attempted relative import in non-package
6 个回答
0
第一个方法之所以有效,是因为Python的 sys.path
的第一个条目是空字符串'',这意味着它会在你运行Python解释器的当前工作目录中查找模块名称。
你遇到的问题是,src
这个目录没有被添加到你的PYTHONPATH中。所以,你可以手动设置PYTHONPATH这个环境变量。
下面是一个使用bash的例子:
export PYTHONPATH=PATH_TO_SRC:${PYTHONPATH}
然后像往常一样运行你的程序。
另一种方法是,在运行程序时,直接向 sys.path
添加路径。
所以,在你的 program.py
文件中,你可以这样写:
if __name__ == '__main__':
import os
import sys
sys.path.append(os.path.dirname(os.path.dirname(__file__)))
your_main_function()
最后,如果你认真进行Python开发,建议你考虑使用 virtualenv 和 virtualenvwrapper,因为它们可以帮你处理大部分这些问题。
2
首先,我建议你阅读一下文档中的这篇文章:修改 Python 的搜索路径。
虽然有些人可能不太赞成,但如果你想在你的程序中修改 PYTHONPATH,根据文档中的 标准模块部分,你可以使用 sys.path.append 方法:
import sys
sys.path.append('..')
import module
1
你难道不能用 PEP 328 来解决这个问题吗?