2014-08-30 59 views
2

我知道,相对进口不建议的,比如从PEP8报价:在开发Python模块时使用绝对导入?

Relative imports for intra-package imports are highly discouraged. Always use the absolute package path for all imports. Even now that PEP 328 is fully implemented in Python 2.5, its style of explicit relative imports is actively discouraged; absolute imports are more portable and usually more readable.

如果我开发包(带几个模块)是什么?在开发过程中,绝对导入不会在没有安装/部署软件包的情况下运行。这是否意味着我必须定期安装/部署当前的WIP模块才能进行测试?

以下是Cld提供的示例。给定一个Python项目/包:

myproject/ 
    package1/ 
    __init__.py 
    somemodule.py 
    package2/ 
    __init__.py 
    somemodule.py 
    somescript.py 
main.py 

main.py,绝对进口工作得很好:

import package1 
import package2.somescript 
import package2.somemodule 

然而,对于模块,例如somescript.py在包2,以下绝对进口:

import package2.somemodule 
import package1 

这会引发ImportError:

Traceback (most recent call last): 
    File "package2/somescript.py", line 1, in <module> 
    import package2.somemodule 
ImportError: No module named package2.somemodule 
+0

您可以采取的一种方法是将项目的根包含在“PYTHONPATH”环境变量中。然后,所有导入都可以是“绝对”的(即相对于项目的根源)。 – arghbleargh 2014-08-30 15:24:26

+0

这可能是一个解决方案。 – Drake 2014-08-30 16:45:12

回答

2

Depand你'主'文件的位置。

如果您有:

myproject/ 
    package1/ 
    __init__.py 
    somemodule.py 
    package2/ 
    __init__.py 
    somemodule.py 
    somescript.py 
main.py 

somescript.py:

import package2.somemodule 
import package1 

main.py

import package1 
import package2.somescript 
import package2.somemodule 

如果执行:蟒蛇包2/somescript.py你错误

Traceback (most recent call last): 
    File "package2/somescript.py", line 1, in <module> 
    import package2.somemodule 
ImportError: No module named package2.somemodule 

但是,如果你执行python main.py,你没有问题。

+0

感谢这个明确的例子。因此,我如何处理子模块中的''absolute imports'',例如你的例子中的'somescript.py'? – Drake 2014-08-30 16:44:44

+0

加入'import os,sys; sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__ file__),os.path.pardir)));'在'somescript.py'开头也许......但真的很脏...... – Cld 2014-08-30 16:58:13

+0

不是一个好主意,因为部署时你必须对它们进行注释,这会增加开发测试部署周期的复杂性。 – Drake 2014-08-30 17:14:03