如何更改 shell 脚本的工作目录

Ran*_*ndy 4 shell cd-command python

我有一个 Python 脚本,可以在相对目录中查找文件。例如:Python 脚本在/home/username/projectname/. 我有一个在 Python 脚本中调用的文件,该文件位于/home/username/projectname/subfolder.

如果我从 shell 运行脚本,因为python scriptname.py它运行得非常好。

但是,我正在尝试将该脚本作为启动服务运行。我在 webmin 中设置它,我相信它创建了一个 shell 脚本来调用它。通过启动脚本,我正在做这样的事情来调用脚本:

execute python home/username/projectname/scriptname.py
Run Code Online (Sandbox Code Playgroud)

脚本启动正常,但无法访问相关目录中的文件。

我猜有一种更好的方法可以从启动脚本中调用 Python 程序,以便它知道相对路径。

bah*_*mat 10

又快又脏:

在您的启动脚本中,而不是仅仅执行 python 脚本,cd首先使用。

#!/bin/sh

cd /home/username/projectname &&
python ./scriptname.py
Run Code Online (Sandbox Code Playgroud)


jlp*_*jlp 7

有几种方法可以直接在您的 Python 脚本中解决此问题。

  1. 如果您的脚本始终位于“/home/username/projectname/subfolder”中,您只需将其添加到 Python 中的搜索路径中即可:

    import sys
    sys.path.append("/home/username/projectname/subfolder")
    
    Run Code Online (Sandbox Code Playgroud)

    但是,我怀疑您可能在多个“projectname”目录中有这个,所以更通用的解决方案是这样的:

    import sys
    import os
    sys.path.append(os.path.join(os.path.dirname(sys.argv[0]), "subfolder"))
    
    Run Code Online (Sandbox Code Playgroud)

    这将找到 Python 脚本所在的目录(在 中sys.argv[0]),提取目录部分,将“子文件夹”附加到其上,并将其放入搜索路径中。

    请注意,某些操作系统可能仅在sys.argv[0]. 对于这种情况,我没有很好的解决方案,也许其他人有。os.path.abspath()如果sys.argv[0]有相对路径,您可能还需要在那里注入一个调用,但稍微尝试一下,您应该能够让它工作。

  2. 与上述答案类似,您可以让 Python 脚本自行更改目录,而无需包装脚本:

    import os
    os.chdir("/home/username/projectname")
    
    Run Code Online (Sandbox Code Playgroud)


Naf*_*Kay 5

一种更快、更脏的方法(使用子外壳):

$ ( cd my/path/to/folder && python myprogram.py )
Run Code Online (Sandbox Code Playgroud)