从另一个目录导入模块时出现Python错误

时间:2017-02-07 06:14:52

标签: python importerror

我看了很多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

我一直试图解决这个问题一个小时,但没有任何工作。请帮忙。

编辑:我通过使用绝对路径解决了这个问题(没有其他工作正常)

4 个答案:

答案 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

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 /文件夹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环境中。