2008-11-22 155 views
6

我在一个Windows环境(我的笔记本电脑!)工作,我需要几个脚本运行其他程序,几乎像一个Windows批处理文件。python作为“批处理”脚本(即从python运行命令)

我该如何从python运行一个命令,让程序运行时会替换脚本?该程序是交互式的(例如,一致),并且始终保持打印线路并询问用户输入。

所以,只运行程序并打印输出是不够的。程序必须接管脚本的输入/输出,相当于从.bat文件运行命令。

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

基本上,在一个批处理脚本,我可以写: 齐声轮廓

我怎么能实现在Python同样的效果?

编辑:

我发现它可以与os.system(...)做,因为我不能接受我自己的答案,我关闭的问题。


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

感谢Claudiu,这几乎是我想要的,除了一件小事:我希望函数在程序退出时结束,但是当我一致尝试它时,它不会将控制权返回给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:\> 

如何解决这个问题?

+0

它有助于提供不工作的脚本运行。 – 2008-11-22 23:53:36

+0

有没有必要关闭这个问题,因为你不能接受你的答案。如果这是最多的投票,它基本上与接受的一样..有点令人讨厌,诚然,但关闭不是正确的方式,我会说.. – dbr 2008-12-27 03:11:37

回答

6

我发现使用os.system我想要做什么,

感谢所有那些试图帮助。

os.system("dir") 

运行命令,就好像它是从一个批处理文件

17

您应该使用subprocess module创建一个新的进程。

我并不熟悉Windows进程,但其Popen功能是跨平台的,应该被优先选择OS特定的解决方案。

编辑:我认为你应该更喜欢子进程模块操作系统特定的功能,它是跨平台和更pythonic(只是谷歌它)。您可以等待结果轻松了,干净

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

不合理的downvote。 +1 – 2008-11-22 19:01:55

+0

对不起,我的错。我确信当使用这样的子进程时不会连接STDIN/STDOUT。显然现在撤销我的投票已经太晚了。 – 2008-11-22 23:15:46

2

os.execlp应该工作。这将搜索您的路径的命令。不要给它任何ARGS,如果他们没有必要:

>>> 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> 
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() 

这应该帮助您开始。如果您想要更详细的答案,请使用更多信息编辑您的问题!