从Python中的相对path导入

我有我的客户端代码的文件夹,我的服务器代码的文件夹,以及它们之间共享的代码的文件夹

Proj/ Client/ Client.py Server/ Server.py Common/ __init__.py Common.py 

如何从Server.py和Client.py导入Common.py?

不要做相对的导入。

从PEP8 :

封装内import的相对import非常令人沮丧。

把所有的代码放到一个超级包里(比如“myapp”),然后使用客户端,服务器和通用代码的子包。

更新:Python 2.6和3.x支持正确的相对导入(…) ”。 请参阅Dave的答案了解更多详情。

编辑2014年11月(3年后):

Python 2.6和3.x支持适当的相对导入,在这里你可以避免做任何事情。 用这种方法,你知道你得到了一个相对的import而不是绝对的import。 “..”表示,转到上面的目录:

 from ..Common import Common 

作为一个警告,这只会在你从包的外面运行你的python作为一个模块时才起作用。 例如:

 python -m Proj 

原来哈克的方式

这种方法在一些情况下仍然是常用的,在这种情况下,你并不是真的在“安装”你的软件包。 例如,它在Django用户中很受欢迎。

您可以将Common /添加到您的sys.path(python查看的导入path列表):

 import sys, os sys.path.append(os.path.join(os.path.dirname(__file__), '..', 'Common')) import Common 

os.path.dirname(__file__)只是给你当前的python文件所在的目录,然后导航到“Common /”目录并导入“Common”模块。

默认的导入方法已经从PYTHONPATH“相对”。 PYTHONPATH是默认情况下,与原始源文件的文件夹一起的一些系统库。 如果使用-m运行模块,则当前目录将被添加到PYTHONPATH中。 因此,如果程序的入口点在Proj内部,那么使用import Common.Common应该可以在Server.py和Client.py中运行。

不要做相对import。 它不会如何工作。

做一个相对的import是绝对没问题! 以下是我做的一些小事:

 #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 

有趣的是,我遇到了同样的问题,我以如下方式得到这个工作:

结合linux命令ln ,我们可以使事情变得非常简单:

 1. cd Proj/Client 2. ln -s ../Common ./ 3. cd Proj/Server 4. ln -s ../Common ./ 

而现在,如果你想从文件: Proj/Common/Common.py导入Proj/Common/Common.py到你的文件: Proj/Client/Client.py ,就像这样:

 # in Proj/Client/Client.py from Common.Common import some_stuff 

而且,这同样适用于Proj/Server ,同样适用于setup.py进程, 这里讨论的同样的问题 ,希望它有帮助!