Python作为“批处理”脚本(即从Python运行命令)
我在使用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 个回答
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()
这应该能帮助你入门。如果你想要更详细的回答,请在你的问题中添加更多信息!
你应该使用 subprocess模块 来创建新的进程。
我对Windows进程不是很熟悉,但它的Popen函数是跨平台的,应该优先选择,而不是使用特定于操作系统的解决方案。
编辑:我坚持认为你应该优先使用Subprocess模块,而不是os.*这些特定于操作系统的函数,因为它是跨平台的,而且更符合Python的风格(你可以去谷歌一下)。你可以很容易地等待结果,并且是干净的:
import os
import subprocess
unison = os.path.join(os.path.curdir, "unison")
p = subprocess.Popen(unison)
p.wait()
我发现 os.system 正好能满足我的需求,
感谢所有尝试帮助我的人。
os.system("dir")
它会像从批处理文件中运行命令一样执行命令。