我想知道在杀死在不同线程中启动的子进程时是否可以关闭通信管道.如果我不调用communic(),那么kill()将按预期工作,在一秒钟而不是五秒后终止进程.
我在这里找到了一个类似问题的讨论,但我没有得到真正的答案.我假设我要么必须能够关闭管道,要么明确地杀死子子进程(在示例中为"sleep")并杀死它以取消阻塞管道.
我也试着在SO上找到她的答案,但是我只发现了这个以及这个,而且这个并没有直接解决这个问题,据我所知(?).
所以我想要做的是能够在第二个线程中运行命令并获取其所有输出,但是当我愿意时能够立即杀死它.我可以通过一个文件和尾巴那个或类似的,但我认为应该有一个更好的方法来做到这一点?
import subprocess, time
from threading import Thread
process = None
def executeCommand(command, runCommand):
Thread(target=runCommand, args=(command,)).start()
def runCommand(command):
global process
args = command.strip().split()
process = subprocess.Popen(args, shell=False, stdout=subprocess.PIPE)
for line in process.communicate():
if line:
print "process:", line,
if __name__ == '__main__':
executeCommand("./ascript.sh", runCommand)
time.sleep(1)
process.kill()
Run Code Online (Sandbox Code Playgroud)
这是脚本:
#!/bin/bash
echo "sleeping five"
sleep 5
echo "slept five"
Run Code Online (Sandbox Code Playgroud)
产量
$ time python poc.py
process: sleeping five
real 0m5.053s
user 0m0.044s
sys 0m0.000s
Run Code Online (Sandbox Code Playgroud) 有没有办法终止使用subprocess.Popen类启动的进程,并将"shell"参数设置为"True"?在下面的工作最小示例(使用wxPython)中,您可以愉快地打开和终止记事本进程,但是如果将Popen"shell"参数更改为"True",则记事本进程不会终止.
import wx
import threading
import subprocess
class MainWindow(wx.Frame):
def __init__(self, parent, id, title):
wx.Frame.__init__(self, parent, id, title)
self.main_panel = wx.Panel(self, -1)
self.border_sizer = wx.BoxSizer()
self.process_button = wx.Button(self.main_panel, -1, "Start process", (50, 50))
self.process_button.Bind(wx.EVT_BUTTON, self.processButtonClick)
self.border_sizer.Add(self.process_button)
self.main_panel.SetSizerAndFit(self.border_sizer)
self.Fit()
self.Centre()
self.Show(True)
def processButtonClick(self, event):
if self.process_button.GetLabel() == "Start process":
self.process_button.SetLabel("End process")
self.notepad = threading.Thread(target = self.runProcess)
self.notepad.start()
else:
self.cancel = 1
self.process_button.SetLabel("Start process")
def runProcess(self):
self.cancel = 0
notepad_process = subprocess.Popen("notepad", shell = False)
while notepad_process.poll() == None: # While process …Run Code Online (Sandbox Code Playgroud) 我试图用来http.server测试Python项目中的所有链接.如果我在运行脚本之前启动服务器,我可以让我的脚本工作,然后当我关闭终端窗口时服务器停止.但我真的很喜欢脚本本身启动和停止服务器.
我制作了一个测试脚本,只需启动服务器,获取页面并证明服务器正在运行,然后停止服务器.我似乎无法得到服务器的pid.当我尝试在脚本运行后杀死此脚本报告的pid时,我收到一条消息,表明没有这样的进程; 但服务器仍在运行.
如何获取服务器的正确pid,或者更一般地说如何从脚本中停止服务器?
import os
import requests
from time import sleep
# Start server, in background.
print("Starting server...")
os.system('python -m http.server &')
# Make sure server has a chance to start before making request.
sleep(1)
print "Server pid: "
os.system('echo $$')
url = 'http://localhost:8000/index.html'
print("Testing request: ", url)
r = requests.get(url)
print("Status code: ", r.status_code)
Run Code Online (Sandbox Code Playgroud) 我想关闭一些使用 os.startfile() 打开的文件,例如 .txt、.csv、.xlsx。
我知道这个问题之前问过,但我没有找到任何有用的脚本。
我使用的是windows 10环境
我很难从python子进程模块中得到我想要的东西(它应该是一个统一的/独立于平台的抽象,afaik,但是不要让我开始那个:)).
所以我所追求的简单事情如下.我想要
现在,我的主要问题是
我希望我足够具体.感谢任何提示/提示 - 我只花了一整天的子流程,恕我直言,这是一个远离平台独立或简单的痛苦: ((但也许只是我)
更新(2010-10-13):
如果你启动一个子进程(即使shell = False),那么subprocess.Popen.kill()函数只会杀死那个子进程(所以如果有任何"孙子"进程,它们将不会被终止. )
我读到了使用preexec_fn参数在所有子进程上设置sid,但它只是unix:超时子进程
我一直有一个问题,我可以杀死产生节点的进程,但节点不会被杀死.有没有人有任何建议如何做到这一点?
我最近尝试完成的一些失败尝试是:
node.terminate()
Run Code Online (Sandbox Code Playgroud)
和
node.send_signal(signal.SIGINT)
Run Code Online (Sandbox Code Playgroud)
以下是代码:
from subprocess import Popen
import json
import sys
import os
import signal
import requests
FNULL = open(os.devnull, 'w')
json_data = open('nodes.json', 'r').read()
data = json.loads(json_data)
port = data['port']
# launch hub
hub = Popen('java -jar selenium-server-standalone-2.37.0.jar -role hub -port %s' % port, stdout=FNULL, stderr=FNULL, shell=True)
#launch nodes
nodes = []
for node in data['nodes']:
options = ''
if node['name'] == 'CHROME':
options += '-Dwebdriver.chrome.driver=../grid/chromedriver '
#options += ' -browser browserName='+node['name']+' maxInstances='+str(node['maxInstances'])
nodes.append(Popen('java -jar selenium-server-standalone-2.37.0.jar …Run Code Online (Sandbox Code Playgroud) 我编写了自己的基于Python的作业调度程序,它使用多处理模块来生成新的作业.我正在尝试使用一种功能来杀死正在运行的进程os.kill,但它无法正常工作.我的(简化)代码如下所示:
from multiprocessing import Process
import os
...
p = Process(target=self.start_job, args=(run_dir,cmd,))
p.start()
...
def start_job(self,run_dir,cmd):
os.chdir(run_dir)
os.system(cmd)
print os.getpid()
...
Run Code Online (Sandbox Code Playgroud)
我想把这个输出的pid(例如3064)和另一个python会话运行:
import os, signal
os.kill(3064, signal.SIGTERM)
Run Code Online (Sandbox Code Playgroud)
os.kill如果我在父/产生进程的pid上运行它,它会起作用,但如果我在子/生成进程的pid上执行它,它就不起作用.除了SIGTERM,我还尝试了许多其他信号,如SIGKILL,SIGQUIT等.它们都没有工作.任何帮助将不胜感激.
我试图从另一个Python脚本运行一个Python脚本,并获得它,pid以便我可以在以后杀死它.
我尝试subprocess.Popen()使用父脚本的参数shell=True', but thepid attribute returns thepid`,所以当我尝试杀死子进程时,它会杀死父进程.
这是我的代码:
proc = subprocess.Popen(" python ./script.py", shell=True)
pid_ = proc.pid
.
.
.
# later in my code
os.system('kill -9 %s'%pid_)
#IT KILLS THE PARENT :(
Run Code Online (Sandbox Code Playgroud) 我正在编写代码来杀死一个进程和所有子进程。
根据这篇文章,可以使用以下命令杀死同一进程组中的所有子进程os.killpg(pro.pid, signal.SIGTERM)
在测试期间,我手动启动了这个进程,它产生了 5 个子进程。
UID PID PPID C STIME TTY TIME CMD
ddd 25066 19475 0 Nov03 ? 00:00:00 /bin/sh -c gtdownload -c ~/.cghub.key --max-children 4 -vv -d https://cghub.ucsc.edu/cghub/data/analysis/download/ab0e89b4-5310-11e4-88da-adc9fc308db6 2
ddd 25067 25066 0 Nov03 ? 00:00:07 /rsrch1/rists/djiao/apps/cghub/libexec/gtdownload -c /rsrch1/rists/djiao/.cghub.key --max-children 4 -vv -d https://cghub.ucsc.edu/cghub/data/analysis/d
ddd 25073 25067 0 Nov03 ? 00:00:18 /rsrch1/rists/djiao/apps/cghub/libexec/gtdownload -c /rsrch1/rists/djiao/.cghub.key --max-children 4 -vv -d https://cghub.ucsc.edu/cghub/data/analysis/d
ddd 25077 25067 0 Nov03 ? 00:00:18 /rsrch1/rists/djiao/apps/cghub/libexec/gtdownload -c /rsrch1/rists/djiao/.cghub.key --max-children 4 -vv -d https://cghub.ucsc.edu/cghub/data/analysis/d …Run Code Online (Sandbox Code Playgroud) 是否可以读取在python中通过LogCat发送的信息?
我有一个用java编写的程序.它发送的每个并条标记:"Fps:"消息:数字
我希望这条消息能够触发我可以在我的python脚本中捕获的事件,这样我就可以绘制一个fps-meter.
python ×10
subprocess ×6
android ×1
events ×1
file ×1
kill ×1
kill-process ×1
logcat ×1
logging ×1
pipe ×1
python-2.6 ×1
python-3.x ×1
python-os ×1
redirect ×1
shell ×1
stdout ×1
windows ×1
windows-xp ×1