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

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

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

如果我从 shell 运行脚本,python scriptname.py它运行得很好。

但是,我正在尝试将该脚本作为启动服务运行。我正在 webmin 中设置它,并且我相信它创建了一个 shell 脚本来调用它。通过启动脚本,我正在执行类似的操作来调用脚本:

execute python home/username/projectname/scriptname.py

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

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

答案1

又快又脏:

在启动脚本中,不要只执行 python 脚本,而是cd首先使用。

#!/bin/sh

cd /home/username/projectname &&
python ./scriptname.py

答案2

有几种方法可以直接在 Python 脚本中解决这个问题。

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

    import sys
    sys.path.append("/home/username/projectname/subfolder")
    

    但是,我怀疑您可能会将其放在多个“projectname”目录中,因此更通用的解决方案如下所示:

    import sys
    import os
    sys.path.append(os.path.join(os.path.dirname(sys.argv[0]), "subfolder"))
    

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

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

  2. 与上面的答案类似,您可以让 Python 脚本自行更改目录,而不需要包装器脚本:

    import os
    os.chdir("/home/username/projectname")
    

答案3

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

( cd my/path/to/folder && python myprogram.py )

答案4

set PYTHONPATH=PROJECTPATH && python script.py

相关内容