[英]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.py
在myApp.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.