我使用 Python 3.5,我的项目结构是这样的:
Project/
App/
myApp.py
Libraries/
myLibA.py
myLibB.py
我想在 myApp.py 中导入 myLibA.py
如果我简单地写 from Libraries import myLibA 我最终会遇到这个错误:
ImportError: No module named Libraries.
我找到了问答 Importing files from different folder in Python ,我从中调整了自己的解决方案,将其添加到 myApp.py 的开头,以便将我的 Project 文件夹添加到 Python 路径:
import sys
sys.path.insert(0, sys.path[0] + "..")
这在 Windows 上运行良好,但是当我从 OSX (10.9) 上的同一项目运行 myApp.py 时,我看到相同的错误消息,找不到我的模块。
重现我的问题非常简单。只需像这样填写 Python 文件:
我的应用程序.py :
import sys
sys.path.insert(0, sys.path[0] + "..")
from Libraries import myLibA
if __name__ == '__main__':
myLibA.print_hello()
myLibA.py :
def print_hello():
print("Hello")
我不明白为什么 Python Path 方法在这里不起作用。无论如何,我正在寻找一种解决方案,使 Python 文件与 Windows 兼容并且包含在源代码中(在 Python 文件中)。我已经看到了一些控制台 Hook ,但我对此并不满意,因为我希望能够在任何使用 Python 3.5 的 OSX/Windows PC 上克隆项目,然后运行 myApp.py。我正在寻找一种解决方案,该解决方案不涉及 Python 3.5 中不存在的任何库。
还有其他方法可以实现吗?
(如果不是,是因为组织这样的项目不是 pythonic 吗?作为 C 开发人员,我可能采用了错误的方法)
请您参考如下方法:
将 __init__.py 添加到您的 Libraries 目录。该文件可以是空的,它神奇地将 Libraries 目录变成了 package .现在:
import sys
import os.path
libdir = os.path.dirname(__file__)
sys.path.append(os.path.split(libdir)[0])
from Libraries import myLibA
if __name__ == '__main__':
myLibA.print_hello()
__file__ 特殊变量给出了当前脚本的文件名。 os.path.dirname() 给出了它所在的目录,os.path.split(libdir)[0] 给出了它的父目录。这应该适用于从中调用脚本的任何地方。
我正在使用 append 而不是 insert。通常建议最后搜索用户目录,并且 append 在 C Python 实现中比 insert 更有效。
