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

rvpgvaaj  于 2023-02-18  发布在  Python
关注(0)|答案(5)|浏览(310)

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

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

laik7k3q

laik7k3q1#

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

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)

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

oymdgrw7

oymdgrw72#

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

os.chdir(sys.path[0])

来自www.example.comhttp://docs.python.org/library/sys.html#sys.path
在程序启动时初始化时,此列表的第一项path[0]是包含用于调用Python解释器的脚本的目录

q5lcpyga

q5lcpyga3#

别这样。
你的脚本和数据不应该被放在一个大目录中。把你的代码放在一些已知的位置(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 )

不要根据你的软件的位置"假设"一个目录。从长远来看,它不会很好地工作。

wlwcrazw

wlwcrazw4#

将crontab命令更改为

* * * * * (cd /home/udi/foo/ || exit 1; ./bar.py)

(...)启动一个子shell,crond将其作为单个命令执行。如果目录不可用,|| exit 1将导致cronjob失败。
虽然从长远来看,其他解决方案可能更适合您的特定脚本,但在您无法修改要执行的程序或命令的情况下,我的示例仍然很有用。

s2j5cfk0

s2j5cfk05#

为了以防万一,您还可以使用pathlib

import os
from pathlib import Path

file = Path(__file__)
parent = file.parent
os.chdir(parent)
# print(file, parent, os.getcwd())

或单行:

os.chdir(Path(__file__).parent)

相关问题