我在导入父文件夹中的脚本时遇到了一个小问题,但我设法使用以下方法解决它:
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
答案 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".
os.path.dirname(path)
-
os.path.join(path, *paths)
-
sys.path
-
A list of strings that specifies the search path for modules.
您可以使用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
您应该将独立脚本放在项目的根文件夹中。脚本不应该用作模块和主脚本。
如果您无法将脚本移动到根目录,请在根目录下创建另一个引导程序脚本,该脚本将导入运行其中专用功能的服务脚本。