如果我执行以下操作:
import subprocess
from cStringIO import StringIO
subprocess.Popen(['grep','f'],stdout=subprocess.PIPE,stdin=StringIO('one\ntwo\nthree\nfour\nfive\nsix\n')).communicate()[0]
Run Code Online (Sandbox Code Playgroud)
我明白了:
Traceback (most recent call last):
File "<stdin>", line 1, in ?
File "/build/toolchain/mac32/python-2.4.3/lib/python2.4/subprocess.py", line 533, in __init__
(p2cread, p2cwrite,
File "/build/toolchain/mac32/python-2.4.3/lib/python2.4/subprocess.py", line 830, in _get_handles
p2cread = stdin.fileno()
AttributeError: 'cStringIO.StringI' object has no attribute 'fileno'
Run Code Online (Sandbox Code Playgroud)
显然,一个cStringIO.StringIO对象不能足够接近文件duck以适应subprocess.Popen.我该如何解决这个问题?
我想使用wxPython创建一个弹出窗口,其作用类似于bash shell.我不想要终端模拟器,我不需要作业控制,我只想要一个基于bash过程的REPL(读取,评估,打印循环).
使用wxPython有一个简单的方法吗?我知道我作为一名tcl/tk程序员的基本概念,但我的wxPython fu很弱,如果我不需要,我不想重新发明轮子.我已经阅读了一些关于py.shell的内容.Shell,但看起来它创建了一个python shell,我想要一个运行bash命令.
我正在尝试编写一个包装我们软件的python脚本.这个脚本需要构建我们的产品并打包它.目前我们有其他脚本分别执行每个部分,包括csh和perl脚本.一个这样的脚本运行如下:
sudo mod args
Run Code Online (Sandbox Code Playgroud)
其中mod是perl脚本; 所以在python我会这样做
proc = Popen(['sudo', 'mod', '-p', '-c', 'noresource', '-u', 'dtt', '-Q'], stderr=PIPE, stdout=PIPE, stdin=PIPE)
Run Code Online (Sandbox Code Playgroud)
问题是这个mod脚本需要回答几个问题.为此,我认为是传统的
(stdout, stderr) = proc.communicate(input='y')
Run Code Online (Sandbox Code Playgroud)
会工作.我不认为它有效,因为Popen控制的过程是sudo,而不是提出问题的mod脚本.有没有办法与mod脚本进行通信并仍然通过sudo运行它?
我看过这个并没有多大帮助.
我有一个Ruby程序,它向cmd行提出一个问题,我想编写一个可以返回答案的Python程序.有谁知道任何链接或一般我怎么可能这样做?
谢谢你的帮助.
编辑
感谢提到管道的人.我没有太多地使用它,并且很高兴它被提起,因为它迫使我更加关注它.