Answers:
Python 2.6和3.x支持适当的相对导入,在这里您可以避免做任何棘手的事情。使用这种方法,您知道您得到的是相对导入而不是绝对导入。“ ..”表示转到我上方的目录:
from ..Common import Common
请注意,仅当您从包外部将python作为模块运行时,此方法才有效。例如:
python -m Proj
在某些情况下,实际上您从来没有“安装”软件包,这种方法仍然很常用。例如,它在Django用户中很流行。
您可以将Common /添加到您的sys.path中(python用来导入内容的路径列表):
import sys, os
sys.path.append(os.path.join(os.path.dirname(__file__), '..', 'Common'))
import Common
os.path.dirname(__file__)
只需为您提供当前python文件所在的目录,然后我们导航至该目录的“ Common /”并导入“ Common”模块。
from ...myfile
去../../myfile
有趣的是,我刚刚遇到了一个相同的问题,我可以通过以下方式获得这项工作:
结合linux命令ln
,我们可以使事情变得更加简单:
1. cd Proj/Client
2. ln -s ../Common ./
3. cd Proj/Server
4. ln -s ../Common ./
而且,现在,如果some_stuff
要从file:Proj/Common/Common.py
导入到file:中Proj/Client/Client.py
,就像这样:
# in Proj/Client/Client.py
from Common.Common import some_stuff
并且,同样适用于Proj/Server
,也适用于setup.py
过程,
此处讨论的相同问题,希望对您有所帮助!
不要做相对导入。
从PEP8:
强烈建议不要将相对进口用于包装内进口。
将所有代码放入一个超级包(即“ myapp”)中,并将子包用于客户端,服务器和通用代码。
更新: “ Python 2.6和3.x支持正确的相对导入(...) ”。有关更多详细信息,请参见Dave的答案。
if __name__ == "__main__":
”行之后将一些代码添加到客户端和服务器的末尾。也就是说,您希望能够将它们用作独立脚本。如何正确做?我认为这是一个应该支持的非常普遍的用例。为什么不鼓励?
进行相对导入绝对可以!这是我的小事:
#first change the cwd to the script path
scriptPath = os.path.realpath(os.path.dirname(sys.argv[0]))
os.chdir(scriptPath)
#append the relative location you want to import from
sys.path.append("../common")
#import your module stored in '../common'
import common.py
__file__
可以从当前文件中获取正确的关系