繁体   English   中英

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

[英]How to import a python file from another folder in Python 3.5 on OSX?

我使用Python 3.5,我的项目结构如下:

Project/
    App/
        myApp.py
    Libraries/
        myLibA.py
        myLibB.py

我想导入myLibA.pymyApp.py

如果我只是from Libraries import myLibA编写from Libraries import myLibA出现此错误:

ImportError:没有名为库的模块。

我找到了Q / A 从Python的其他文件夹导入文件 ,从中改编了自己的解决方案,将其添加到myApp.py的开头,以便将Project文件夹添加到Python路径:

import sys
sys.path.insert(0, sys.path[0] + "..")

这在Windows上运行良好,但是当我在OSX(10.9)上的同一项目中运行myApp.py ,我看到相同的错误消息,但找不到我的模块。

重现我的问题很简单。 只需像这样填充Python文件:

myApp.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文件中)中的解决方案。 我已经看到了一些控制台挂钩,但是对此我感到不满意,因为我希望能够在任何使用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更有效。

您要导入的每个文件夹中都应包含__init__.py 同样,python项目的常见项目结构是:

Project/ 
Libraries/         <-- this will contain app specific code (Libraries)
    __init__.py
    myLibA.py
    myLibB.py
main.py

例如main.py将包含您应用的输入代码,例如C的main()

from Libraries import myLibA

if __name__ == '__main__':
    myLibA.print_hello()

无需在运行时修改sys.path。

这个问题有点相似。 我最喜欢的答案是在您的情况下建议这样的项目结构:

Project/
    myApp.py
    Libraries/
        __init__.py
        myLibA.py
        myLibB.py

myLibA.py的库代码不变的情况下,应用程序代码和导入将如下所示:

from Libraries import myLibA

if __name__ == "__main__":
    myLibA.print_hello()

编辑1:

当需要所请求的文件夹结构时,将此更改为myApp.py文件:

import sys
import os
sys.path.append(os.path.abspath(".."))

也可以。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM