繁体   English   中英

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

[英]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   

或者

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

我的应用程序/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

我希望您传递folder1folder2 ,然后尝试

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM