python3从不同项目导入模块

11 浏览
0 Comments

python3从不同项目导入模块

我有以下目录结构:\n

py_test
├── __init__.py
├── dir1
│   ├── __init__.py
│   └── script1.py
└── dir2
    ├── __init__.py
    └── script2.py

\n在script2中,我想要\"import ..\\script1\"。\n我在script2中尝试了以下方法:\n

    \n

  1. 不起作用\n
    from ..dir1 import script1
    ImportError: attempted relative import with no known parent package`
    

  2. \n

  3. 起作用\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)
    

  4. \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

0
0 Comments

问题的出现原因是,如果script2.py是入口点,尝试从上一级目录导入模块将不起作用。这是因为当模块的__name__不包含任何包信息时(例如,设置为__main__),无论模块实际位于文件系统的位置如何,相对导入都将被解析为顶级模块。

如果模块被作为入口点运行,或者通过python script2.py这样的方式传递给解释器,模块的__name__将被设置为__main__。以这种方式运行的Python模块不再具有导入来自上层目录的文件所需的信息。

因此,有两个解决方法:

方法一:继续使用sys.path.append的解决方法

这种方法可以按照您的期望工作,但比较繁琐。

方法二:使入口点位于顶级目录

假设您的包有多个需要运行的脚本,您可以创建一个新文件,导入script1script2,然后根据命令行参数调用所需的功能。这样,您就可以保持当前目录结构,并且相对导入可以正常工作,无需对sys.path进行任何调整。

代码示例:

import script1

import script2

# 根据命令行参数调用所需的功能

0