首页 文章

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

提问于
浏览
0

我有一个名为“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 回答

  • 0

    如果要根据文件与脚本的相对位置来引用文件,则可以保证'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'不在当前工作目录中 .

    通常的快速和脏的解决方案是明确获取脚本路径:

    import os
    import sys
    
    scriptdir = os.path.abspath(os.path.dirname(sys.argv[0]))
    

    sys.argv [0]是脚本的全名 - 在大多数平台上,这意味着绝对路径或此时至少仍然有效的相对路径 . 如果您担心其他平台,可能需要查看__file__ . 当然,如果您使用zipfile或类似文件运行脚本,那么它们都不会有用 .

    open(os.path.join(scriptdir, "cfg.yaml"))
    

    (或者你甚至可以强行 os.chdir(scriptdir) 如果你愿意,但如果你是,例如,接受用户的路径名,这可能是一个坏主意 . )

    正确的解决方案是编写要安装的脚本和数据文件(即使您实际上没有安装任何东西并从源代码树中运行它),然后使用 pkg_resources 查找数据文件 . 这也将为您解决许多其他问题 - 但它确实需要更多的学习 . 如果您想在这条路上开始,请参阅Python Packaging User Guide,并将Package Data and Data Files作为特定的起点 .

  • 0

    尝试

    #!/bin/sh
    
    cd ../../scripts
    python test.py
    

    我假设你在test.py中引用了一个本地路径的yaml,它希望脚本从脚本目录运行(而不是从 data1/data2

    作为一个旁边你总是 print os.getcwd() 在运行python脚本时看到你的工作目录(或者在bash中只是 pwd

相关问题