相关疑难解决方法(0)

在杀死用python子进程Popen启动的进程时,如何关闭stdout-pipe?

我想知道在杀死在不同线程中启动的子进程时是否可以关闭通信管道.如果我不调用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)

python subprocess stdout kill pipe

9
推荐指数
1
解决办法
3545
查看次数

Windows上的Python 2.6:如何使用"shell = True"参数终止subprocess.Popen?

有没有办法终止使用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)

python windows windows-xp subprocess python-2.6

7
推荐指数
3
解决办法
9506
查看次数

如何从Python脚本中杀死SimpleHTTPServer?

我试图用来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)

python simplehttpserver python-requests

7
推荐指数
1
解决办法
9481
查看次数

如何关闭使用 os.startfile() 打开的文件,Python 3.6

我想关闭一些使用 os.startfile() 打开的文件,例如 .txt、.csv、.xlsx。

我知道这个问题之前问过,但我没有找到任何有用的脚本。

我使用的是windows 10环境

python file python-3.x python-os

7
推荐指数
1
解决办法
1万
查看次数

带有shell = True的python子进程:重定向和与平台无关的子进程终止

我很难从python子进程模块中得到我想要的东西(它应该是一个统一的/独立于平台的抽象,afaik,但是不要让我开始那个:)).

所以我所追求的简单事情如下.我想要

  • 启动外部(stdio)应用程序(可能使用子进程),我使用shell样式重定向(如'./myapp> stdout_log> stderr_log')
    • 基本上我想执行一个shell命令行,所以我必须为subprocess.Popen()指定shell = True(否则命令行中的重定向将不起作用)
  • 我想以异步方式启动此命令行(因此它作为一个独立的子进程运行,但我的python进程不会等待它的完成)
  • (我的父python进程会不时查看子进程的日志以提取信息,但这与问题无关)
  • 如果我的父python进程决定,它应该能够终止这个子进程.

现在,我的主要问题是

  • 我基本上被迫使用shell = True来重定向工作
  • 在父python进程中处理子进程的stdout/stderr不是一个选项,因为我找不到以非等待方式执行它的功能(并且父进程必须做其他事情)
  • 如果我使用shell = True,那么subprocess.kill()将只终止shell而不是子进程
  • 我需要一个可靠的子进程终止方法,适用于任何平台(但至少Linux和Windows)

我希望我足够具体.感谢任何提示/提示 - 我只花了一整天的子流程,恕我直言,这是一个远离平台独立或简单的痛苦: ((但也许只是我)

更新(2010-10-13):

如果你启动一个子进程(即使shell = False),那么subprocess.Popen.kill()函数只会杀死那个子进程(所以如果有任何"孙子"进程,它们将不会被终止. )

我读到了使用preexec_fn参数在所有子进程上设置sid,但它只是unix:超时子进程

python shell logging redirect subprocess

6
推荐指数
1
解决办法
5186
查看次数

子进程会杀死子进程,但不会杀死子进程产生的进程

我一直有一个问题,我可以杀死产生节点的进程,但节点不会被杀死.有没有人有任何建议如何做到这一点?

我最近尝试完成的一些失败尝试是:

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 subprocess selenium-grid

6
推荐指数
1
解决办法
2397
查看次数

os.kill没有处理衍生过程

我编写了自己的基于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 multiprocessing kill-process

6
推荐指数
1
解决办法
9613
查看次数

python - subprocess.Popen().pid返回父脚本的pid

我试图从另一个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)

python subprocess

6
推荐指数
2
解决办法
2万
查看次数

os.killpg 寻找什么 PID

我正在编写代码来杀死一个进程和所有子进程。

根据这篇文章,可以使用以下命令杀死同一进程组中的所有子进程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 subprocess

6
推荐指数
1
解决办法
2265
查看次数

通过Python从Android访问LogCat

是否可以读取在python中通过LogCat发送的信息?

我有一个用java编写的程序.它发送的每个并条标记:"Fps:"消息:数字

我希望这条消息能够触发我可以在我的python脚本中捕获的事件,这样我就可以绘制一个fps-meter.

python events android logcat android-logcat

5
推荐指数
2
解决办法
8126
查看次数