从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
进程, 这里讨论的同样的问题 ,希望它有帮助!