【问题标题】:Python 2.7 packages and importing between directoriesPython 2.7 包和目录之间的导入
【发布时间】:2015-08-20 21:01:57
【问题描述】:

好的,所以我已经为此苦苦挣扎了一个多星期,并且我已经尝试了本网站和谷歌上的其他方法中提到的各种方法,但这里就可以了。我正在运行 python 2.7。我在父目录中有一个 python 脚本,它调用位于子目录中的第二个脚本。第二个脚本启动一个不同的线程并对第三个也是最后一个脚本进行 os.system 调用。第三个脚本需要导入位于父目录中的内容。有人能告诉我这个设置有什么问题吗?我确实在每个正在使用的文件夹中都有__init__.py。我确实尝试将相对父目录添加到路径中。我不确定我哪里出错了。

File Structure

Parent Directory
    Python_Script_1.py
    Imports_needed.py
    __init__.py
    Child Directory
        Python_Script_2.py
        Python_Script_3.py
        __init__.py

方法一

Python_Script_2.py
import os
import sys
import multiprocessing

def listen():
    listen_string = "python ~/path/Python_Script_3.py"
    os.system(listen_string)

q = multiprocessing.Process(target=listen())




Python_Script_3.py
import sys
sys.path.append("..")
import Imports_needed

ImportError:没有名为“Imports_needed”的模块

方法二

Python_Script_2.py
import os
import sys
import multiprocessing

def listen():
    listen_string = "python ~/path/Python_Script_3.py"
    os.system(listen_string)

q = multiprocessing.Process(target=listen())


Python_Script_3.py
import sys
sys.path.append("..")
from .. import Imports_needed

ValueError: 尝试在非包中进行相对导入

关于方法2的问题,为什么每个目录都包含__init__.py,但它告诉我这不是一个包?

此外,我过去曾使用过与方法 1 非常相似的东西,但我看不出我的代码或文件结构之间有任何差异。如果有人有任何建议,我将不胜感激。谢谢。

编辑:抱歉,我忘记了描述中相当重要的内容。涉及到第三个文件,我完全忘记了... 很抱歉 :( Python_Script_2 通过多处理创建一个新线程并对 Python_Script_3 进行 os.system 调用。Python_Script_3 与 Python_Script_2 位于同一子目录中。Python_Script_3 正在导入尝试从父目录导入 Imports_needed.py 时出现问题。我已经更新了问题以反映这一点。(对不起,我知道这是我遗漏的一个主要细节,但它是一个复杂的包并且做更多的事情不仅仅是我要问的)

【问题讨论】:

    标签: python-2.7 python-import python-multithreading


    【解决方案1】:

    试试下面的

    from Parent_Directory import Imports_needed
    

    from Parent_Directory.Imports_needed import <your class or method>
    

    【讨论】:

    • 第一个导致“ImportError: No module named Parent_Directory”(我已经确保所有内容都拼写正确,所以不是那样)第二个导致“ImportError: No module named Parent_Directory.Imports_needed "
    • 确保目录名称中没有空格 -> 应该是 Parent_DirectoryChild_Directory...
    • 是的,没有空格
    • 抱歉,我忘记了描述中相当重要的内容。涉及到第三个文件,我完全忘记了......很抱歉:(已对原始问题进行了编辑
    【解决方案2】:

    你不需要

    sys.path.append("..")
    

    完全没有。如果从主脚本导入Python_Script_2.py,则Python_Script_2.py 内部的导入路径将相对于主脚本。所以

    import Imports_needed
    

    就够了。 确保您的子目录中的文件 _init__.py 有双下划线前缀(在您的示例中,您只有 1 个下划线符号 _)。

    更新

    如果你依赖 sys.path.append(),你应该使用:

    import os
    import sys
    sys.path.append(os.path.realpath('..'))
    

    否则,'..' 不会向解释器说明您的应用环境。

    【讨论】:

    • 下划线只是我的例子中的一个错字。使用 import Imports_needed 导致“ImportError: No module named Imports_needed”
    • 抱歉,我忘记了描述中相当重要的内容。涉及到第三个文件,我完全忘记了......很抱歉:(已对原始问题进行了编辑
    • 或许您正面临以下情况。您正在调用os.system("python ~/path/Python_Script_3.py") 命令,该命令直接执行 Python_Script_3.py ,后者成为子进程的“主”程序文件。自然,它对您的导入路径和父目录一无所知,因此它会引发一个异常,该异常会打印到输出中,该异常会转到父进程的输出,并且您认为那是产生异常的父进程,而不是。
    • 父进程运行完成。这只是在导入时死亡的子进程
    • 这正是我要说的。确保父进程运行完成,因为它没有异常。当然,子进程会死掉,因为它对您的父目录一无所知并引发异常。注释os.system(listen_string) 行,您将看到不再有错误。如果你想导入 3d 文件,你应该从你的主文件启动子进程并传递一个参数来执行 3d 文件:os.system("python ~/path/Python_Script_1.py --import-my-3d-file-param")
    猜你喜欢
    • 1970-01-01
    • 2015-09-23
    • 1970-01-01
    • 2016-12-27
    • 2012-07-08
    • 1970-01-01
    • 2020-09-08
    • 1970-01-01
    • 2019-08-03
    相关资源
    最近更新 更多