Python 从另一个目录导入模块时出错
Python Error while importing module from another directory
我看了很多 Whosebug 帖子,但我不明白为什么我会遇到这个问题
我的文件系统
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
我已经尝试解决这个问题一个小时了,但没有任何效果。请帮忙。
编辑: 我使用绝对路径解决了这个问题(没有别的工作)
我更喜欢你将 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 *
我希望这能解决您的问题
我在 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
执行
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
myapp/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
这是我想出的解决方案:
可以灵活地从子文件夹和父文件夹调用
import importlib
import sys
class MyClass:
def __init__(self):
sys.path.append('../folder1/')
sys.path.append('../../folder1/')
当你需要使用来自外部模块的 class 时,使用这样的东西:
mod = importlib.import_module('MyExternalModule')
my_object = getattr(mod, 'MyExternalClass')
这是对@noobycoder 的回答,但可能不是最佳做法。
最好的方法是为外部模块创建一个包并安装在您的 python 环境中。
我看了很多 Whosebug 帖子,但我不明白为什么我会遇到这个问题
我的文件系统
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
我已经尝试解决这个问题一个小时了,但没有任何效果。请帮忙。
编辑: 我使用绝对路径解决了这个问题(没有别的工作)
我更喜欢你将 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 *
我希望这能解决您的问题
我在 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
执行
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
myapp/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
这是我想出的解决方案:
可以灵活地从子文件夹和父文件夹调用
import importlib
import sys
class MyClass:
def __init__(self):
sys.path.append('../folder1/')
sys.path.append('../../folder1/')
当你需要使用来自外部模块的 class 时,使用这样的东西:
mod = importlib.import_module('MyExternalModule')
my_object = getattr(mod, 'MyExternalClass')
这是对@noobycoder 的回答,但可能不是最佳做法。 最好的方法是为外部模块创建一个包并安装在您的 python 环境中。