在Python中使用相对和绝对路径感到困惑

时间:2014-12-11 00:56:42

标签: python path absolute relative

我有一个名为" 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"不是指相对路径。我该如何解决这个问题?

2 个答案:

答案 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作为特定的起点。