Python 2.7包和目录之间的导入

时间:2015-08-20 21:01:58

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

好的,所以我一直在努力解决这个问题已经有一个多星期了,我已经尝试过这个网站上提到的各种方法以及google上的其他方法但是这里有。我正在运行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

方法1

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”的模块

方法2

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时出现问题。我已经更新了问题以反映这一点。(对不起,我知道这是我遗漏的一个重要细节但它是一个复杂的包并做了很多事情而不仅仅是我所要求的)

2 个答案:

答案 0 :(得分:0)

尝试以下

from Parent_Directory import Imports_needed

from Parent_Directory.Imports_needed import <your class or method>

答案 1 :(得分:0)

你不需要

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('..'))

否则,'..'对解释器的应用环境没有任何说明。