我有一个python项目,结构如下:
repo_dir/
----project_package/
--------__init__.py
--------process.py
--------config.py
----tests/
--------test_process.py
__init__.py
为空
config.py
看起来像这样:
name = 'brian'
用法
我通过从project/project/
目录运行python process.py
,或者通过指定python文件路径来使用库。我在amazonec2linux上运行python2.7。你知道吗
当process.py
如下所示时,一切正常,process.py
打印brian
。你知道吗
import config
print config.name
当process.py
如下所示时,我得到错误ImportError: No module named project.config
。你知道吗
import project.config
print config.name
当process.py
如下所示时,我得到错误ImportError: No module named project
。这是有意义的,因为前面的示例中的行为应该是相同的。你知道吗
from project import config
print config.name
如果我将这些行添加到process.py
以将库根包含在sys.path
,那么上面的所有配置都可以正常工作。你知道吗
import os
import sys
sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '..')))
我的困惑
许多参考资料建议设置python库来使用project.module_name
导入模块,但是sys.path
附加似乎不是标准的,而且我需要它似乎很奇怪。我看得出来系统路径append将我的库根添加为sys中的路径,但我认为这就是我的库根中的__init__.py
应该做的。有什么好处?我错过了什么?我知道Python导入会带来很多麻烦,所以我试着尽可能地简化这个过程,让我的头脑围绕着它。我快疯了,今天是放假前的星期五。我很沮丧。请帮忙!!你知道吗
问题
我应该如何设置我的库?我应该如何导入包?我应该在哪里有__init__.py
文件?我需要将我的库根附加到系统路径在每个项目中?为什么这么混乱?你知道吗
我认为问题在于你如何运行你的脚本。如果希望脚本位于包(内部
project
文件夹)中,则应使用python -m project.process
而不是按文件名运行它。然后可以进行绝对或显式的相对导入,以从process
获取config
。你知道吗绝对导入将是
from project import config
或import project.config
。你知道吗显式的相对导入是
from . import config
。你知道吗python2也允许隐式的相对导入,但是它们是一个非常糟糕的错误特性,您永远不应该使用它。通过隐式相对导入,内部包模块可以隐藏顶级模块。例如,
project/json.py
文件会对包中的所有其他模块隐藏标准库的json
模块。您可以通过将from __future__ import absolute_import
放在文件的顶部来告诉Python您想要禁止隐式的相对导入。这是python3中的标准行为。你知道吗项目设置正常。为了清楚起见,我重新命名了目录 在本例中,结构与您的相同:
当您有一个模块要从中的另一个模块导入时 同样的项目,最好的方法是使用相对进口。例如:
在dev box上编写代码时,在Python virtualenv中进行工作, 在“可编辑”模式下安装项目。你知道吗
使用这种方法,您将永远不需要在
sys.path
中混日子 几乎总是错误的方法。你知道吗相关问题 更多 >
编程相关推荐