我有一个名为“test.py”的脚本,并引用一个名为“cfg.yaml”的配置文件 . 这两个驻留在名为“test / scripts”的同一目录中 .
test/scripts/test.py
test/script/cfg.yaml
现在我在名为task.sh的“test / data1 / data2”中编写一个bash脚本
从task.sh里面,我想调用python脚本
test.sh内容如下:
#!/bin/sh
python ../../scripts/test.py
test.py打开并读取cfg.yaml就像open(“cfg.yaml”)但是当调用test.sh时,它会失败,因为“cfg.yaml”不是用相对路径引用的 . 我该如何解决这个问题?
2 回答
如果要根据文件与脚本的相对位置来引用文件,则可以保证't just use a relative path for that, because the script may not be in the current working directory. In fact, in your case, it'不在当前工作目录中 .
通常的快速和脏的解决方案是明确获取脚本路径:
sys.argv [0]是脚本的全名 - 在大多数平台上,这意味着绝对路径或此时至少仍然有效的相对路径 . 如果您担心其他平台,可能需要查看__file__ . 当然,如果您使用zipfile或类似文件运行脚本,那么它们都不会有用 .
(或者你甚至可以强行
os.chdir(scriptdir)
如果你愿意,但如果你是,例如,接受用户的路径名,这可能是一个坏主意 . )正确的解决方案是编写要安装的脚本和数据文件(即使您实际上没有安装任何东西并从源代码树中运行它),然后使用
pkg_resources
查找数据文件 . 这也将为您解决许多其他问题 - 但它确实需要更多的学习 . 如果您想在这条路上开始,请参阅Python Packaging User Guide,并将Package Data and Data Files作为特定的起点 .尝试
我假设你在test.py中引用了一个本地路径的yaml,它希望脚本从脚本目录运行(而不是从
data1/data2
)作为一个旁边你总是
print os.getcwd()
在运行python脚本时看到你的工作目录(或者在bash中只是pwd
)