我正在尝试用Python进行系统调用,并将输出存储到我可以在Python程序中操作的字符串中.
#!/usr/bin/python
import subprocess
p2 = subprocess.Popen("ntpq -p")
Run Code Online (Sandbox Code Playgroud)
我尝试了一些事情,包括一些建议:
但没有任何运气.
我在Ubuntu上使用eSpeak并且有一个Python 2.7脚本可以打印并说出一条消息:
import subprocess
text = 'Hello World.'
print text
subprocess.call(['espeak', text])
Run Code Online (Sandbox Code Playgroud)
eSpeak会产生所需的声音,但是外壳会出现一些错误(ALSA lib ...,没有套接字连接),因此我无法轻易读取之前打印的内容.退出代码为0.
不幸的是,没有任何记录的选项可以关闭它的详细程度,所以我正在寻找一种只能在视觉上使其静音并保持打开的外壳清洁以进行进一步交互的方法.
我怎样才能做到这一点?
我想将我运行的命令的输出分配给os.system变量,并防止它输出到屏幕.但是,在下面的代码中,输出被发送到屏幕并且打印的var值为0,我猜这表示命令是否成功运行.有没有办法将命令输出分配给变量并阻止它显示在屏幕上?
var = os.system("cat /etc/services")
print var #Prints 0
Run Code Online (Sandbox Code Playgroud) 我用subprocess模块调用不同的进程.但是,我有一个问题.
在以下代码中:
callProcess = subprocess.Popen(['ls', '-l'], shell=True)
Run Code Online (Sandbox Code Playgroud)
和
callProcess = subprocess.Popen(['ls', '-l']) # without shell
Run Code Online (Sandbox Code Playgroud)
两者都有效.阅读文档后,我开始知道这shell=True意味着通过shell执行代码.这意味着在缺席的情况下,该过程将直接启动.
那么我应该更喜欢我的情况 - 我需要运行一个进程并获得其输出.从shell内部或外部调用它有什么好处.
要从我的Python脚本启动程序,我使用以下方法:
def execute(command):
process = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
output = process.communicate()[0]
exitCode = process.returncode
if (exitCode == 0):
return output
else:
raise ProcessException(command, exitCode, output)
Run Code Online (Sandbox Code Playgroud)
因此,当我启动一个类似的过程时Process.execute("mvn clean install"),我的程序会一直等到过程结束,然后我才能获得程序的完整输出.如果我正在运行需要一段时间才能完成的过程,这很烦人.
我可以让我的程序逐行写入进程输出,通过在循环结束之前轮询进程输出或其他内容吗?
**[编辑]抱歉,在发布此问题之前我没有很好地搜索.线程实际上是关键.在这里找到一个示例,说明如何执行此操作:** 来自线程的Python Subprocess.Popen
Python中Ruby和Perl中的反引号相当于什么?也就是说,在Ruby中我可以这样做:
foo = `cat /tmp/baz`
Run Code Online (Sandbox Code Playgroud)
Python中的等效语句是什么样的?我已经尝试os.system("cat /tmp/baz")但是将结果置于标准输出并返回给我该操作的错误代码.
我希望stdout在运行os.system调用后获取变量.
让我们以此行为例:
batcmd="dir"
result = os.system(batcmd)
Run Code Online (Sandbox Code Playgroud)
result将包含错误代码(stderr 0在Windows下或1在某些linux下用于上面的示例).
如何stdout在执行的命令中不使用重定向来获取上述命令?
我试过了
#:PEP8 -E223
Run Code Online (Sandbox Code Playgroud)
要么
# pep8: disable=E223
Run Code Online (Sandbox Code Playgroud)
我认为第二个会起作用,但似乎不起作用.
你知道我怎么能处理这个吗?
在python中,我可以使用os或subprocess运行一些系统命令.问题是我无法将输出作为字符串.例如:
>>> tmp = os.system("ls")
file1 file2
>>> tmp
0
Run Code Online (Sandbox Code Playgroud)
我有一个旧版本的子进程没有函数check_out,我更喜欢一个不需要更新该模块的解决方案,因为我的代码将运行在我没有完全管理员权限的服务器上.
这个问题似乎微不足道,但我找不到一个简单的解决方案
python ×10
subprocess ×4
python-2.7 ×2
backticks ×1
command-line ×1
espeak ×1
os.system ×1
pep8 ×1
shell ×1
stderr ×1
stdout ×1
terminal ×1