我有一个名为“ test.py”的脚本,它引用一个名为“ cfg.yaml”的配置文件。这两个位于同一目录“ test / scripts”。
test/scripts/test.py
test/script/cfg.yaml
现在,我正在“ test / data1 / data2”内编写一个名为task.sh的bash脚本
从task.sh内部,我想调用python脚本
test.sh内容如下:
#!/bin/sh
python ../../scripts/test.py
test.py会像open(“ cfg.yaml”)一样打开并读取cfg.yaml,但是当调用test.sh时,它会失败,因为“ cfg.yaml”没有用相对路径引用。我该如何解决?
尝试
#!/bin/sh
cd ../../scripts
python test.py
我假设在test.py中,您使用本地路径引用yaml,该路径期望脚本从scripts目录运行(而不是从data1/data2
运行)
顺便说一句,在运行python脚本时,您总是可以print os.getcwd()
来查看工作目录(或者在bash中只是pwd
)
如果要根据文件的相对位置到脚本来引用文件,则不能仅使用相对路径,因为脚本可能不在当前工作目录中。实际上,就您而言,保证not位于当前工作目录中。
通常的快捷和肮脏的解决方案是显式获取脚本路径:
import os
import sys
scriptdir = os.path.abspath(os.path.dirname(sys.argv[0]))
sys.argv[0]
是脚本的全名-在大多数平台上,这意味着绝对路径或相对路径在此时至少仍然有效。如果您担心其他平台,则可能需要查看sys.argv[0]
。当然,如果您是从zip文件或类似文件中运行脚本,那么这两个脚本都将无用。
__file__
(或者,如果需要,甚至可以强制__file__
,但是如果您例如接受用户的路径名,那可能是个坏主意。]
正确解决方案是将脚本和数据文件编写为已安装(即使您实际上没有安装任何东西并在源代码树中运行它),然后使用open(os.path.join(scriptdir, "cfg.yaml"))
查找数据文件。那也将为您解决很多其他问题,但是它确实需要更多的学习知识。如果要在那条路上开始,请参阅os.chdir(scriptdir)
,并以pkg_resources
作为特定起点。