从另一个目录导入类

Jsh*_*hee 1 python import python-import

我有:

script1.py in database/table_inserts/  #trying to import below file into
dbcrud.py in database/                 #trying to import by above file
Run Code Online (Sandbox Code Playgroud)

script1.py我有:

from ..dbcrud import set_db_setting
Run Code Online (Sandbox Code Playgroud)

但这会引发错误:

   from ..dbcrud import set_db_setting
SystemError: Parent module '' not loaded, cannot perform relative import
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?

Chi*_*xus 7

编辑:

感谢@Mad Physicist评论。

解决您的问题的最简单和琐碎的方法是__init__.pydatabase/文件夹中添加一个空文件,并将另一个空__init__.py文件添加到database/table_inserts/文件夹中,以便被识别为一个包。

请参阅此层次结构示例:

database/
??? dbcrud.py
??? __init__.py
??? table_inserts
    ??? __init__.py
    ??? script1.py

1 directory, 4 files
Run Code Online (Sandbox Code Playgroud)

然后你所要做的script1.py就是dbcrud.py像这个例子一样导入你的模块:

# Note here the double dots '..'
from ..dbcrud import you_module
Run Code Online (Sandbox Code Playgroud)

否则,如果您想要其他解决方案,您可以$PYTHONPATH像这样编辑变量:

dbcrud.py:

class DBCrud:
    def __init__(self):
        print("I'm DBCrud'")
Run Code Online (Sandbox Code Playgroud)

脚本1.py

# Add the parent directory to your module
# by using this kind of hack
import os, sys
sys.path.insert(1, os.path.join(sys.path[0], '..'))
# Then import your module
from dbcrud import DBCrud

class Script1:
    def __init__(self):
        print("I'm Script1'")
        DBCrud.__init__(self)

# test
if __name__ == '__main__':
    app = Script1()
Run Code Online (Sandbox Code Playgroud)

现在,您可以从database/文件夹或database/table_insers/文件夹运行测试示例:

~$ pwd
/user/path/database/table_inserts
~$ python3 script1.py
Run Code Online (Sandbox Code Playgroud)

输出:

I'm Script1'
I'm DBCrud'
Run Code Online (Sandbox Code Playgroud)

和:

~$ pwd
/user/path/database
~$ python3 table_inserts/script1.py
Run Code Online (Sandbox Code Playgroud)

输出:

I'm Script1'
I'm DBCrud'
Run Code Online (Sandbox Code Playgroud)

  • 感谢这篇冗长的帖子。我只是觉得它应该更容易? (2认同)