我有一个 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 脚本中解决这个问题。
如果您的脚本始终位于“/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]
,但是稍微尝试一下,您应该能够让它工作。与上面的答案类似,您可以让 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