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   

PYTHONPATHsys.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 环境中。