关于脚本:python作为”批处理”脚本(即从python运行命令)

python as a “batch” script (i.e. run commands from python)

我在Windows环境中工作(我的笔记本电脑!)我需要一些运行其他程序的脚本,非常像Windows批处理文件。

如何从python运行命令,以便程序在运行时替换脚本?该程序是交互式的(例如unison),它一直在打印行并请求用户输入。

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

我试过os.execl,但它总是告诉我"无效参数",而且它找不到程序名(不搜索路径变量);我必须给它完整的路径…..!

基本上,在批处理脚本中,我可以编写:协调剖面

如何在Python中实现相同的效果?

编辑:

我发现这可以用os.system( ... )来完成,因为我不能接受自己的答案,所以我要结束这个问题。

编辑:这应该是一个评论,但当我发布它时,我没有太多的分数。

感谢Claudiu,这正是我想要的,除了一点:当程序退出时,我希望函数结束,但是当我统一尝试时,它不会将控制权返回到python脚本,而是返回到windows命令行环境。

1
2
3
4
5
6
7
8
9
10
11
12
13
>>> 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:\>

怎么绕过这个?


您应该使用子流程模块创建一个新的流程。

我对windows进程不太熟悉,但它的popen功能是跨平台的,应该预先提供给操作系统特定的解决方案。

编辑:我认为你应该更喜欢子进程模块而不是OS.*特定于OS的功能,它是跨平台的,而且更像是pythonic(只需谷歌它)。您可以轻松、干净地等待结果:

1
2
3
4
5
import os
import subprocess
unison = os.path.join(os.path.curdir,"unison")
p = subprocess.Popen(unison)
p.wait()


我发现os.system做了我想做的,

谢谢你所做的一切。

1
os.system("dir")

就像从批处理文件运行命令一样运行该命令


1
2
3
4
5
6
7
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()

这将帮助您开始。如果您想得到更详细的答案,请用更多信息编辑您的问题!


os.execlp应该工作。这将在您的路径中搜索该命令。如果不需要,不要给它任何参数:

1
2
3
4
5
6
7
>>> import os
>>> os.execlp("cmd")

D:\Documents and Settings\Claudiu>Microsoft Windows XP [Version 5.1.2600]
(C) Copyright 1985-2001 Microsoft Corp.

D:\Documents and Settings\Claudiu>