我看了很多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
我一直试图解决这个问题一个小时,但没有任何工作。请帮忙。
编辑:我通过使用绝对路径解决了这个问题(没有其他工作正常)
答案 0 :(得分:1)
我在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.
答案 1 :(得分:0)
我希望您将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 *
我希望这是你问题的解决方案
答案 2 :(得分:0)
相对导入适用于您的包。
当您运行python main.py
时,它无法找到当前包
考虑到父文件夹的路径为/path/up/to/parent_folder
执行
python -m parent_folder.folder2.main from /path/up/to
OR
将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
的myapp / entry.py:
import sys
from package.folder2 import start
if __name__ == '__main__':
sys.exit(start.main())
的myapp /文件夹2 / 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
答案 3 :(得分:0)
这是我想出的解决方案:
可以灵活地从子文件夹和父文件夹调用
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环境中。