Skip to main content
 首页 » 编程设计

python之如何从 OSX 上的 Python 3.5 中的另一个文件夹导入 python 文件

2025年05月04日14bonelee

我使用 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 更有效。