[英]Python Error while importing module from another directory
我看过很多stackoverflow帖子,但我不明白为什么我会遇到这个问题
我的文件系统
parent_folder
|folder1
|module1.py
|module2.py
|__init__.py
|folder2
|main.py
我想将 module1.py 和 module2.py 导入 main.py。
我的 __init__.py 文件具有以下内容
__all__=['module1','module2']
这是我在 main.py 中尝试的内容
from ..folder1 import *
但这给了我这个错误:
Traceback (most recent call last):
File "main.py", line 2, in <module>
from ..folder1 import *
SystemError: Parent module '' not loaded, cannot perform relative import
我一直试图解决这个问题一个小时,但没有任何效果。 请帮忙。
编辑:我通过使用绝对路径解决了这个问题(没有其他工作)
我在 python webapp2 中这样做。 如果有帮助,请告诉我。
from folder1.module1 import module1 #i did not try * but i hope it will also work.
from folder1.module2 import module2 #i did not try * but i hope it will also work.
相对导入适用于您的包。 当您运行python main.py
它无法找到当前包
考虑到父文件夹的/path/up/to/parent_folder
是/path/up/to/parent_folder
执行
python -m parent_folder.folder2.main from /path/up/to
或者
将PYTHONPATH
或sys.path
设置为/path/up/to/parent_folder
,然后将导入更改为以下
from folder2 import *
并执行python main.py
更新
一个相对进口用例是消耗你的package
从脚本外面包。 该脚本通常充当入口点或可执行文件。
以下是一个示例目录结构
myapp
│ entry.py
│
└───package
│ __init__.py
│ __init__.pyc
│
├───folder1
│ module1.py
│ __init__.py
│
└───folder2
start.py
__init__.py
我的应用程序/entry.py:
import sys
from package.folder2 import start
if __name__ == '__main__':
sys.exit(start.main())
myapp/folder2/start.py:
import sys
from ..folder1.module1 import *
# this is relative import to "package".
# Use?: It will avoid confusion and conflicts with other packages in your syspath. Improve readability at some extent,
def main():
print "do something with folder1.module1 imported objects"
和$ python entry.py
我希望您传递folder1
到folder2
,然后尝试
from folder1 import *
或者,如果您想以这种方式保留文件夹,您可以尝试
import sys
sys.path.append("../") # or maybe sys.path.append("..")
from folder1 import *
如果您不想添加到系统路径,这会将folder1
添加到您的系统路径中,请尝试
import os
os.chdir("../") #or maybe os.chdir("..")
from folder1 import *
我希望这是您问题的解决方案
这是我提出的解决方案:
可以灵活地从子文件夹和父文件夹调用
import importlib
import sys
class MyClass:
def __init__(self):
sys.path.append('../folder1/')
sys.path.append('../../folder1/')
当您需要使用来自外部模块的类时,请使用以下内容:
mod = importlib.import_module('MyExternalModule')
my_object = getattr(mod, 'MyExternalClass')
这是对@noobycoder 的回答,但可能不是最佳实践。 最好的方法是为外部模块创建一个包并安装在你的 python 环境中。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.