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

问题描述 投票:0回答:2

我有一个名为“ 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”没有用相对路径引用。我该如何解决?

python python-import relative-path
2个回答
0
投票

尝试

#!/bin/sh

cd ../../scripts
python test.py

我假设在test.py中,您使用本地路径引用yaml,该路径期望脚本从scripts目录运行(而不是从data1/data2运行)

顺便说一句,在运行python脚本时,您总是可以print os.getcwd()来查看工作目录(或者在bash中只是pwd


0
投票

如果要根据文件的相对位置到脚本来引用文件,则不能仅使用相对路径,因为脚本可能不在当前工作目录中。实际上,就您而言,保证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作为特定起点。

© www.soinside.com 2019 - 2024. All rights reserved.