在python中使用mutliple parent和children文件夹中的相对导入

时间:2015-05-27 13:31:46

标签: python import sys

我在导入父文件夹中的脚本时遇到了一个小问题,但我设法使用以下方法解决它:

import sys
sys.path.append("../")

我的目录是这样的:

Data
|->->code
     |->->script1.py
     |->->->->subfolder
              |->->->script2.py

当我从子文件夹目录运行script2(导入script1)时,脚本运行没有问题。但是,如果我尝试使用以下命令从代码目录运行script2:

:~ ./subfolder/script2.py

我收到错误:

ImportError: No module named script1

我尝试使用相对导入,但因为我的代码不是在包中构建的,所以它不起作用。有没有办法可以从两个目录(父目录和子目录)运行script2,并且每次都能够导入script1?

提前谢谢你, Georgi Nikolov

编辑:好的,在我阅读完所有建议后,我做了一个简单的" hack在我看来非常难看,但效果很好:

import sys
parent_folder = sys.path[0].split("/subfolder")[0]
sys.path.append(parent_folder)
import script1

现在我甚至可以从root调用script2,它将设法导入script1

2 个答案:

答案 0 :(得分:1)

要导入一个级别的模块,您可以使用它。

import os, sys
sys.path.append(os.path.join(os.path.dirname(__file__), ".."))

解释

__file__            # The full path to your running file.
os.path.dirname     # See below. (1)
os.path.join        # See below. (2)
sys.path.append     # See below. (3)
".."                # Universal for "up a level".
  1. os.path.dirname(path) -

      

    Return the directory name of pathname path.

  2. os.path.join(path, *paths) -

      

    Join one or more path components intelligently.

  3. sys.path -

      

    A list of strings that specifies the search path for modules.

  4. 您可以使用append方法添加字符串。

答案 1 :(得分:1)

您应该使用绝对路径:

import sys, os
HERE = os.path.abspath(os.path.dirname(__file__))
sys.path.append(os.path.join(HERE, ".."))

但最好不要这样做:Guido views running scripts within a package as an anti-pattern

您应该将独立脚本放在项目的根文件夹中。脚本不应该用作模块和主脚本。

如果您无法将脚本移动到根目录,请在根目录下创建另一个引导程序脚本,该脚本将导入运行其中专用功能的服务脚本。