2014-12-11 56 views
0

我有一个名为“test.py”的脚本,并且引用了一个名为“cfg.yaml”的配置文件。这两个驻留在同一个名为“test/scripts”的目录中。在Python中使用相对和绝对路径的困惑

test/scripts/test.py 
test/script/cfg.yaml 

现在我正在写“测试/数据1 /数据2”之称task.sh

从task.sh内内bash脚本,我想要的python脚本

通话

test.sh内容如下:

#!/bin/sh 

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

test.py打开和读取cfg.yaml像打开( “cfg.yaml”),但是当test.sh被调用时,它失败,因为“CFG。 yaml“不被相对pa引用日。我该如何解决这个问题?

+0

1.您可以从test/scripts运行test.py,2.在test.py中,您可以将cfg文件的路径更改为'../../scripts/test.py'或3.您可以使用cfg文件的绝对路径。发生这种情况是因为python解释器正在从test/data1/data2中调用 – rivu 2014-12-11 01:00:13

+0

相对路径是相对于当前工作目录的,而不是相对于正在执行的文件的位置 – mehtunguh 2014-12-11 02:19:26

回答

0

尝试

#!/bin/sh 

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

我承担你引用与期望脚本从脚本目录运行(而不是从data1/data2

为预留本地路径YAML test.py你总是可以用print os.getcwd()看看你的工作目录是在运行python脚本的时候(或者只是pwd在bash中)

+0

我喜欢你的解决方案最好!谢谢乔兰。我不知道我可以直接从bash脚本内部执行Python脚本。它工作正常。 – user2921139 2014-12-11 22:19:43

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