python:将脚本工作目录更改为脚本自己的目录

2024-04-26 23:40:20 发布

您现在位置:Python中文网/ 问答频道 /正文

我每分钟都从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]))

是最简洁优雅的解决方案。谢谢你的回答和解释!


Tags: 方法py目录脚本logconfighomefoo
3条回答

别这样。

不应将脚本和数据混入一个大目录中。将代码放在与数据分离的某个已知位置(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 )

不要根据软件的位置“假设”一个目录。从长远来看,不会有好结果的。

使用sys.path[0]可以得到较短的版本。

os.chdir(sys.path[0])

来自http://docs.python.org/library/sys.html#sys.path

As initialized upon program startup, the first item of this list, path[0], is the directory containing the script that was used to invoke the Python interpreter

这将更改当前工作目录,以便打开相对路径:

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)

这将获取脚本的文件名,将其转换为绝对路径,然后提取该路径的目录,然后更改为该目录。

相关问题 更多 >