从 Python 中的相对路径导入

新手上路,请多包涵

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

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

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

原文由 Drew 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 353
2 个回答

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

Python 2.6 和 3.x 支持适当的相对导入,您可以在其中避免做任何骇人听闻的事情。使用此方法,您知道您获得的是 相对 导入而不是 绝对 导入。 ‘..’ 的意思是,转到我上面的目录:

 from ..Common import Common

需要注意的是,这仅在您从包 外部 将 python 作为模块运行时才有效。例如:

 python -m Proj

原始的 hacky 方式

这种方法在某些情况下仍然很常用,在这些情况下您实际上并没有“安装”您的包。例如,它很受 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”模块。

原文由 Dave 发布,翻译遵循 CC BY-SA 3.0 许可协议

有趣的是,我刚遇到同样的问题,我通过以下方式完成这项工作:

结合 linux 命令 ln ,我们可以让事情变得更简单:

 1. cd Proj/Client
2. ln -s ../Common ./

3. cd Proj/Server
4. ln -s ../Common ./

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

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

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

原文由 jacoolee 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题