我有一个脚本,我用popen启动一个shell命令.问题是脚本不会等到popen命令完成后立即继续.
om_points = os.popen(command, "w")
.....
Run Code Online (Sandbox Code Playgroud)
如何判断我的Python脚本要等到shell命令完成?
我正在寻找一种Python解决方案,它允许我将命令的输出保存在文件中,而不会将其从控制台中隐藏.
仅供参考:我问的是tee(作为Unix命令行实用程序)而不是Python intertools模块中具有相同名称的函数.
tee,在Windows下不可用)stderr而努力stdoutstderr = subprocess.STDOUT不起作用.以下是我发现的一些不完整的解决方案:
图http://blog.i18n.ro/wp-content/uploads/2010/06/Drawing_tee_py.png
#!/usr/bin/python
from __future__ import print_function
import sys, os, time, subprocess, io, threading
cmd = "python -E test_output.py"
from threading import Thread
class StreamThread ( Thread ):
def __init__(self, buffer):
Thread.__init__(self)
self.buffer = buffer
def run ( self ):
while 1:
line = self.buffer.readline()
print(line,end="") …Run Code Online (Sandbox Code Playgroud) 有人可以解释为什么我想要的结果,"嗨",前面有一个字母'b',后跟一个换行符?
我使用的是Python 3.3
>>> import subprocess
>>> print(subprocess.Popen("echo hi", shell=True,
stdout=subprocess.PIPE).communicate()[0])
b'hi\n'
Run Code Online (Sandbox Code Playgroud)
如果我用python 2.7运行它,则不会出现这个额外的'b'
我之间是完全糊涂了subprocess.call(),subprocess.Popen(),subprocess.check_call().
哪个是封锁哪个不是?
如果我用我的意思说的是subprocess.Popen()父进程是否等待子进程return/ exit它继续执行之前.
shell=True这些电话怎么影响?
我想从像一些shell命令得到的输出ls或者df在Python脚本.我看到它commands.getoutput('ls')已被弃用,但subprocess.call('ls')只会给我返回代码.
我希望有一些简单的解决方案.
``Backtick%x{}百分比X <Backtick的替代语法system()fork()open()IO.popen()<表现相同open()open("|-")IO.popen("-")<表现相同open("|-")Open3.popen3()require 'open3'PTY.spawn()require 'pty'Shell.transact()require 'shell'编辑1. 非常感谢Avdi Grimm的帖子描述了每种方法的示例用法:#1(&gist); #2(&gist); #3.
他们是很好的资源来回答如何,但没有明确的组成来回答每个应该使用或为什么,并因此恕我直言这个问题不完整的答案.
有没有办法确保所有创建的子进程在Python程序的退出时间都死了?通过子进程,我指的是使用subprocess.Popen()创建的.
如果没有,我应该迭代所有发出的杀戮然后杀死-9?什么更干净?
import subprocess
def my_function(x):
return x + 100
output = subprocess.Popen(my_function, 1) #I would like to pass the function object and its arguments
print output
#desired output: 101
Run Code Online (Sandbox Code Playgroud)
我只找到了使用单独脚本打开子进程的文档.有谁知道如何传递函数对象甚至是一种简单的方法来传递函数代码?
我写了一些如下的陈述:
os.system(cmd) #do something
subprocess.call('taskkill /F /IM exename.exe')
Run Code Online (Sandbox Code Playgroud)
两者都会弹出一个控制台.
如何阻止它弹出控制台?
import os
import subprocess
proc = subprocess.Popen(['ls','*.bc'], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
out,err = proc.communicate()
print out
Run Code Online (Sandbox Code Playgroud)
此脚本应打印带有.bc后缀的所有文件,但它会返回一个空列表.如果我在命令行中手动执行ls*.bc它可以工作.在脚本中执行['ls','test.bc']也可以,但由于某些原因,星形符号不起作用..任何想法?
subprocess ×10
python ×9
popen ×3
coding-style ×1
command ×1
console ×1
function ×1
kill ×1
performance ×1
python-2.7 ×1
python-3.x ×1
ruby ×1
shell ×1
standards ×1
stderr ×1
stdout ×1
tee ×1
wait ×1
wildcard ×1
windows ×1