python:将脚本工作目录更改为脚本自己的目录
-
07-07-2019 - |
题
我每分钟从crontab运行一个python shell:
* * * * * /home/udi/foo/bar.py
/ home / udi / foo
有一些必要的子目录,如 / home / udi / foo / log
和 / home / udi / foo / config
, /home/udi/foo/bar.py
指的是。
问题是 crontab
从不同的工作目录运行脚本,因此尝试打开 ./ log / bar.log
会失败。
有没有一种很好的方法告诉脚本将工作目录更改为脚本自己的目录?我想要一个适用于任何脚本位置的解决方案,而不是明确告诉脚本它在哪里。
修改强>
os.chdir(os.path.dirname(sys.argv[0]))
是最紧凑的优雅解决方案。感谢您的回答和解释!
解决方案
这会将您当前的工作目录更改为打开相对路径:
import os
os.chdir("/home/udi/foo")
但是,您询问如何更改Python脚本所在的目录,即使您不知道编写脚本时将使用哪个目录。为此,您可以使用 os.path
函数:
import os
abspath = os.path.abspath(__file__)
dname = os.path.dirname(abspath)
os.chdir(dname)
这将获取脚本的文件名,将其转换为绝对路径,然后提取该路径的目录,然后更改为该目录。
其他提示
您可以使用 sys.path [0]
获得更短的版本。
os.chdir(sys.path[0])
来自 http://docs.python.org/library/sys.html #sys.path中
在程序启动时初始化,此列表的第一项,
path [0]
,是包含以前用于的脚本的目录 调用Python解释器
不要这样做。
您的脚本和数据不应该被嵌入到一个大目录中。将代码放在与数据分开的某个已知位置( site-packages
或 / var / opt / udi
或其他)。对代码使用良好的版本控制,以确保您将当前版本和先前版本相互分离,以便您可以回退到以前的版本并测试将来的版本。
底线:不要混淆代码和数据。
数据很珍贵。代码来了又去。
提供工作目录作为命令行参数值。您可以提供默认值作为环境变量。不要推断它(或猜测它)
使其成为必需的参数值并执行此操作。
import sys
import os
working= os.environ.get("WORKING_DIRECTORY","/some/default")
if len(sys.argv) > 1: working = sys.argv[1]
os.chdir( working )
不要“假设”基于软件位置的目录。从长远来看,它不会很好。
将crontab命令更改为
* * * * * (cd /home/udi/foo/ || exit 1; ./bar.py)
(...)
启动你的crond作为单个命令执行的子shell。 ||如果目录不可用,则退出1
会导致cronjob失败。
虽然从长远来看其他解决方案对于特定脚本可能更为优雅,但在无法修改要执行的程序或命令的情况下,我的示例仍然有用。