如何从Python调用批处理文件的相对路径

0 投票
2 回答
4767 浏览
提问于 2025-04-18 09:40

我该如何从Python调用批处理文件的相对路径呢?

我的Python脚本叫做'Script.py',它在这个目录下:"d:\2014\python\script.py"。我想从这个文件中调用一个批处理文件,路径是"d:\2014\input\batch1.bat",但是我想用相对路径来调用它,使用的是popen()函数。

在Script.py中

import os, sys
from subprocess import Popen
p = Popen("D:\\2014\\input\\batch1.bat", cwd=r"D:\\2014\\input")
stdout, stderr = p.communicate()

上面的代码可以正常工作,但下面的代码就不行了

p = Popen("..\\input\\batch1.bat", cwd=r"..\\input")
stdout, stderr = p.communicate()

会出现找不到文件的错误

2 个回答

1

来自Python的文档

“如果cwd不是None,子进程的当前目录会在执行之前被更改为cwd。请注意,这个目录在查找可执行文件时并不被考虑,所以你不能相对于cwd来指定程序的路径。”

一个非常相似的问题在这里被提到,试试:

[...]
fn = os.path.join(os.path.dirname(__file__), "..\\input\\batch1.bat")
p = Popen(fn, cwd=r"D:\\2014\\input")
[...]
2

在Python中,程序运行时会把你执行程序的地方当作当前目录。你可以用os.getcwd()来获取当前目录。

假设我在桌面上有一个测试用的Python脚本,叫做pycwd.py:

import os
print os.getcwd()

从不同的地方调用这个脚本,会得到不同的结果:

C:\Users\me>python Desktop\pycwd.py
C:\Users\me
C:\Users\me\Desktop>python pycwd.py
C:\Users\me\Desktop

你可以使用SiHa上面提到的解决方案:

path_to_directory_of_this_python_file = os.path.dirname(__file__)
path_to_your_batch_file = os.path.join(path_directory_of_this_python_file, '..', 'input', 'batch1.bat')
p = Popen(path_to_your_batch_file)

Popen中的cwd参数是你想要执行批处理文件的路径(比如说,如果批处理文件只希望从某个特定目录调用的话)。编辑一下:对于你的jar文件,设置popen中的cwd为你的jar文件所在的目录。你能把这个路径写成相对路径吗?也就是说相对于Python文件或批处理文件,还是只能写成绝对路径?

撰写回答