Python作为“批处理”脚本(即从Python运行命令)

14 投票
4 回答
19635 浏览
提问于 2025-04-11 19:59

我在使用Windows系统(我的笔记本电脑!),需要写几个脚本来运行其他程序,基本上就像Windows的批处理文件一样。

我想知道怎么从Python运行一个命令,让这个程序在运行时可以替代脚本。这个程序是交互式的(比如unison),它会不断输出信息并要求用户输入。

所以,仅仅运行一个程序并打印输出是不够的。这个程序必须接管脚本的输入和输出,基本上就像从.bat文件运行命令一样。

我试过用os.execl,但它总是告诉我“无效参数”,而且找不到程序名(没有搜索PATH变量);我必须给出完整路径..?!

基本上,在批处理脚本中我可以写:

unison profile

那么我怎么在Python中实现同样的效果呢?

编辑:

我发现可以用os.system( ... )来实现,因为我不能接受自己的回答,所以我就关闭了这个问题。


编辑:这本来是个评论,但我发的时候积分不够。

谢谢Claudiu,这基本上就是我想要的,除了一个小问题:我希望函数在程序退出时结束,但当我在unison上尝试时,它并没有把控制权返回给Python脚本,而是返回给了Windows命令行环境。

>>> os.execlp("unison")

C:\>Usage: unison [options]
    or unison root1 root2 [options]
    or unison profilename [options]

For a list of options, type "unison -help".
For a tutorial on basic usage, type "unison -doc tutorial".
For other documentation, type "unison -doc topics".

C:\>
C:\>
C:\>

我该怎么解决这个问题呢?

4 个回答

4
import subprocess

proc = subprocess.Popen(['unison', 'profile'], stderr=subprocess.PIPE,      
                        stdout=subprocess.PIPE, stdin=subprocess.PIPE)

proc.stdin.write('user input')
print proc.stdout.read()

这应该能帮助你入门。如果你想要更详细的回答,请在你的问题中添加更多信息!

18

你应该使用 subprocess模块 来创建新的进程。

我对Windows进程不是很熟悉,但它的Popen函数是跨平台的,应该优先选择,而不是使用特定于操作系统的解决方案。

编辑:我坚持认为你应该优先使用Subprocess模块,而不是os.*这些特定于操作系统的函数,因为它是跨平台的,而且更符合Python的风格(你可以去谷歌一下)。你可以很容易地等待结果,并且是干净的:

import os
import subprocess
unison = os.path.join(os.path.curdir, "unison")
p = subprocess.Popen(unison)
p.wait()
7

我发现 os.system 正好能满足我的需求,

感谢所有尝试帮助我的人。

os.system("dir")

它会像从批处理文件中运行命令一样执行命令。

撰写回答