python3从不同项目导入模块
python3从不同项目导入模块
我有以下目录结构:\n
py_test ├── __init__.py ├── dir1 │ ├── __init__.py │ └── script1.py └── dir2 ├── __init__.py └── script2.py
\n在script2
中,我想要\"import ..\\script1
\"。\n我在script2
中尝试了以下方法:\n
- \n
- 不起作用\n
from ..dir1 import script1 ImportError: attempted relative import with no known parent package`
- 起作用\n
import sys, os path2add = os.path.normpath(os.path.abspath(os.path.join(os.path.dirname(__file__), os.path.pardir, 'dir1'))) if (not (path2add in sys.path)) : sys.path.append(path2add)
\n
\n
\n如果我想选择选项1,那么能够使其工作的最简单的文件/目录结构是什么?\n我知道这个,但我想知道是否可以避免创建那个目录结构,仍然使用type-1的import
。\n我目前正在使用这个解决方法,它使用了type-2的import
。\n相关问题:\nHow to import a Python class that is in a directory above?\nImport a module from a directory (package) one level up\nGetting \"ImportError: attempted relative import with no known parent package\" when running from Python Interpreter\nUsing importlib to dynamically import module(s) containing relative imports\nHow to import variables in a different python file
问题的出现原因是,如果script2.py
是入口点,尝试从上一级目录导入模块将不起作用。这是因为当模块的__name__
不包含任何包信息时(例如,设置为__main__
),无论模块实际位于文件系统的位置如何,相对导入都将被解析为顶级模块。
如果模块被作为入口点运行,或者通过python script2.py
这样的方式传递给解释器,模块的__name__
将被设置为__main__
。以这种方式运行的Python模块不再具有导入来自上层目录的文件所需的信息。
因此,有两个解决方法:
方法一:继续使用sys.path.append
的解决方法
这种方法可以按照您的期望工作,但比较繁琐。
方法二:使入口点位于顶级目录
假设您的包有多个需要运行的脚本,您可以创建一个新文件,导入script1
和script2
,然后根据命令行参数调用所需的功能。这样,您就可以保持当前目录结构,并且相对导入可以正常工作,无需对sys.path
进行任何调整。
代码示例:
import script1
import script2
# 根据命令行参数调用所需的功能