我有一个名为" test.py"的脚本并引用名为" cfg.yaml"的配置文件。这两个位于名为" test / scripts"。
的同一目录中test/scripts/test.py
test/script/cfg.yaml
现在我正在写一个bash脚本" test / data1 / data2"叫做task.sh
从task.sh里面,我想调用python脚本
test.sh内容如下:
#!/bin/sh
python ../../scripts/test.py
test.py打开并读取cfg.yaml就像open(" cfg.yaml")但是当调用test.sh时,它会失败,因为" cfg.yaml"不是指相对路径。我该如何解决这个问题?
答案 0 :(得分:0)
试
#!/bin/sh
cd ../../scripts
python test.py
我假设在test.py中你引用了一个本地路径的yaml,它希望脚本从脚本目录运行(而不是从data1/data2
)
另外,您可以始终print os.getcwd()
查看运行python脚本时的工作目录(或者只是bash中的pwd
)
答案 1 :(得分:0)
如果要根据文件的相对位置引用文件,则不能仅使用相对路径,因为脚本可能不在当前的工作目录。事实上,在您的情况下,它保证不位于当前工作目录中。
通常的快速和肮脏的解决方案是明确地获取脚本路径:
import os
import sys
scriptdir = os.path.abspath(os.path.dirname(sys.argv[0]))
sys.argv[0]
是您脚本的全名 - 在大多数平台上,这意味着绝对路径或此时至少仍然有效的相对路径。如果您担心其他平台,可能需要查看__file__
。当然,如果您从zip文件或类似文件中运行脚本,那么它们都不会有用。
open(os.path.join(scriptdir, "cfg.yaml"))
(或者,如果您愿意,您甚至可以强行os.chdir(scriptdir)
,但如果您(例如,接受用户的路径名),这可能是一个坏主意。)
正确的解决方案是编写要安装的脚本和数据文件(即使您实际上没有安装任何内容并从源代码中运行它树),然后使用pkg_resources
来查找数据文件。这也将为您解决许多其他问题 - 但它确实需要更多的学习。如果您想要在这条路上开始,请参阅Python Packaging User Guide,并Package Data and Data Files作为特定的起点。