0

因此,我正在尝试编写一个在 Windows 中使用命令行的脚本,它默认为我的 Python 目录下的结构 - 我不希望这样。

import subprocess
import time
subprocess.call(r"""Cscript %windir%/System32/Printing_Admin_Scripts/en-US/Prnport.vbs -a -r "saturn.print.mediag.com" -h "saturn.print.mediag.com" -o raw""")
time.sleep(5)
subprocess.call(r"""rundll32 printui.dll, PrintUIEntry /if /b "Saturn" /f w:\printers\toshibae3511\eng\est_c2.inf /r "saturn.print.mediag.com" /m "TOSHIBA e-STUDIO Color PS3""")
raw_input("press any key to exit")

第一个子进程调用应该执行 c:\windows\system32 等中的脚本 prnport.vbs,但它会像 c:\python27\projects\printer setup\%windir%\system32 等一样执行

如何使它进入正确的目录,该目录可能(尽管可能不会)因计算机而异?

4

2 回答 2

2

您需要os.path.expandvars在路径上使用“%windir%”来替换。

此外,除了问题之外,最好将参数列表而不是单个长字符串传递给subprocess.call,即

subprocess.call(['rundll32', 'printui.dll'...])
于 2012-04-11T12:42:56.267 回答
1

您需要使用环境变量来获取 windir,%WINDIR% 不会扩展为您期望的值,因此假定它是相对于当前工作目录的。您可以使用os.environ["WINDIR"]or os.getenv("WINDIR", "default_value"),根据:此链接

我不确定是不是这样,我不在 Windows 上,但你需要类似的东西:

import os
windir = os.environ["WINDIR"]
subprocess.call(r'Cscript %s/System32/Printing_Admin_Scripts/en-US/Prnport.vbs -a -r "saturn.print.mediag.com" -h "saturn.print.mediag.com" -o raw' % (windir,))

并对多行使用三引号 """。单行使用 ' 或 " 不需要它们

否则,您将使用以下命令更改当前工作目录:

import os
os.chdir('C:\\Windows\\Sytem32\\')
subprocess.call(r'Cscript ./System32/Printing_Admin_Scripts/en-US/Prnport.vbs -a -r "saturn.print.mediag.com" -h "saturn.print.mediag.com" -o raw')
于 2012-04-11T12:42:06.663 回答