标签: popen

如何杀死python中的所有子进程

在 python 中我打开了 4 个子进程。现在,当 python 脚本中出现新请求时,我想终止所有先前的进程。

我正在使用 python 2.7 和 windows 7 操作系统。

谢谢,

python windows subprocess popen

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

Go:与另一个进程进行双向通信?

(注意)不是Go Inter-Process Communication的欺骗,它询问 System V IPC。(尾注)

使用os/exec,如何与另一个进程进行交互通信?我想获取进程的 stdin 和 stdout 的 fd,并使用这些 fd 写入和读取进程。

我发现的大多数示例都涉及运行另一个进程,然后获取结果输出。

这是我正在寻找的 python 等效项。

p = subprocess.Popen("cmd", stdin=subprocess.PIPE, stdout=subprocess.PIPE)
(child_stdin, child_stdout) = (p.stdin, p.stdout)
Run Code Online (Sandbox Code Playgroud)

As a tangible example, consider opening a pipe to dc, sending the line 12 34 +p and receiving the line 46.

(update)

func main() {
  cmd := exec.Command("dc")
  stdin, err := cmd.StdinPipe()
  must(err)
  stdout, err := cmd.StdoutPipe()
  must(err)

  err = cmd.Start()
  must(err)

  fmt.Fprintln(stdin, "2 2 +p")

  line := …
Run Code Online (Sandbox Code Playgroud)

popen go

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

无法使用 POpen 将参数传递给子进程

我目前正在研究为 ROS(机器人操作系统)创建一个通用配置工具。使用subprocess.POpen()并且Tkinter我正在创建treeview这样的:

在此输入图像描述

由于简洁的方式rospack list(列出系统上安装的所有软件包的命令,包括开发人员在其中创建自己的软件包的相应工作区中的软件包)的工作方式,前两列的创建相当简单:

ros_packages_install_retrieve = subprocess.Popen(["rospack list"], shell=True, stdout=subprocess.PIPE)
ros_packages_installed = []
for ros_package in ros_packages_install_retrieve.stdout.readlines():
    ros_package_adapted = ros_package.split(" ")
    ros_package_adapted[1] = ros_package_adapted[1][:-1]
    ros_packages_installed.append(ros_package_adapted)
Run Code Online (Sandbox Code Playgroud)

由于调用问题, “要求”列是一个棘手的问题rospack depends <package>(列出(如果有的话)系统上需要存在的所有软件包<package>,以便构建和/或运行)。对于里面的每个包,ros_packages_installed我调用以下函数:

def get_deps(ros_package):
    ros_package_deps_retrieve = subprocess.Popen(["rospack", "depends", ros_package], shell=True, stdout=subprocess.PIPE)
    ros_package_deps = []
    for ros_package_dep in ros_package_deps_retrieve.stdout.readlines():
        ros_package_dep = ros_package_dep.split("\n")
        ros_package_dep = ros_package_dep[:-1]
        ros_package_deps.append(ros_package_dep)

    return ros_package_deps
Run Code Online (Sandbox Code Playgroud)

问题是我得到了

[rospack]错误:没有给出包

并且返回值始终是一个空列表。我什至尝试将ros_package参数连接到命令本身,但一切都是徒劳的。

在我徒劳的尝试中,我发现了一些相当奇怪的事情。和实际上list都是depends传递给 …

python arguments subprocess popen ros

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

如何在 lua 中抑制来自 popen 的错误消息

我需要为主机上的给定 PID 运行此命令。

cmd = cat /proc/$PID/cgroup | grep -o  -e "docker-.*.scope"
io.popen(cmd)
Run Code Online (Sandbox Code Playgroud)

当 PID 是一个容器时,这很好,但我偶尔会看到,

cat: /proc/12345/cgroup: No such file or directory
Run Code Online (Sandbox Code Playgroud)

因此,我执行以下操作:

f1 = io.open("/proc/" .. PID .. "/cgroup", "r+")
if (f1 == nil) then return end

local filename = "/proc/" .. PID .. "/cgroup"
local cmd = "test -f " .. filename .. " && cat " .. filename .. " grep -o -e "docker-.*.scope"
local f2 = io.popen(cmd)
Run Code Online (Sandbox Code Playgroud)

我仍然偶尔看到错误消息, cat: /proc/5678/cgroup: No such file or directory …

lua popen

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

python subprocess.Popen和ssh端口在后台转发

我需要具有基本上模拟用户使用ssh创建端口转发的功能.所以,本质上应该像如下: -执行ssh -f -N -L 10000:gateway:11000 localhost -如果有来自该命令的输出,显示给用户,用户泵作为一个响应输入-完成我想出了下面的代码,几乎做什么,我需要:

    ssh_proc = Popen(['ssh', '-f', '-N', '-L', '10000:gateway:11000', 'localhost'], stdin=PIPE, stdout=PIPE)
stdoutdata, stderrdata = ssh_proc.communicate()
Run Code Online (Sandbox Code Playgroud)

但问题是它永远不会完成.我看到命令已执行并且已创建转发隧道,但仍然卡住了().我可以用Ctrl + C打破这个并得到这个:

    ^CTraceback (most recent call last):
  File "sshman.py", line 278, in <module>
    add(args.remote_host, args.remote_port, args.local_port, args.local_host)
  File "sshman.py", line 125, in add
    stdoutdata, stderrdata = ssh_proc.communicate()
  File "/usr/lib64/python2.7/subprocess.py", line 740, in communicate
    return self._communicate(input)
  File "/usr/lib64/python2.7/subprocess.py", line 1256, in _communicate
    stdout, stderr = self._communicate_with_poll(input)
  File "/usr/lib64/python2.7/subprocess.py", line 1310, in _communicate_with_poll
    ready = poller.poll()
KeyboardInterrupt
Run Code Online (Sandbox Code Playgroud)

由于我使用-f和ssh命令,它应该分叉连接.有没有办法在完成后中断communication()或是否有更优雅的解决方案? …

python ssh fork subprocess popen

0
推荐指数
1
解决办法
4253
查看次数

python:使用Popen与shell命令交互

我需要使用python执行几个shell命令,但无法解决其中一个问题。当我scp到另一台计算机时,通常会提示并询问是否将此计算机添加到已知主机。我希望程序自动输入“是”,但无法使其正常工作。到目前为止,我的程序如下所示:

from subprocess import Popen, PIPE, STDOUT

def auto():
  user = "abc"
  inst_dns = "example.com"    
  private_key = "sample.sem"
  capFile = "/home/ubuntu/*.cap"

  temp = "%s@%s:~" %(user, inst_dns)
  scp_cmd = ["scp", "-i", private_key, capFile, temp]

  print ( "The scp command is: %s" %" ".join(scp_cmd) )
  scpExec = Popen(scp_cmd, shell=False, stdin=PIPE, stdout=PIPE)
  # this is the place I tried to write "yes" 
  # but doesn't work
  scpExec.stdin.write("yes\n")
  scpExec.stdin.flush()
  while True:
    output = scpExec.stdout.readline()
    print ("output: %s" %output)
    if output == "": 
      break
Run Code Online (Sandbox Code Playgroud)

如果我运行该程序,它仍会提示并要求输入。如何自动响应提示?谢谢。

python stdin popen

0
推荐指数
1
解决办法
2371
查看次数

POpen使用字符串但不是变量

我可以得到以下工作:

fp = popen("curl http://192.168.0.144:8000/adder?wsdl", "r");
Run Code Online (Sandbox Code Playgroud)

但是,当我这样尝试时:

char* cmd;
strcpy(cmd, "curl http://");
strcat(cmd, qrdata->ip_addr);
strcat(cmd, ":8000/adder?wsdl");

fp = popen(cmd, "r");
Run Code Online (Sandbox Code Playgroud)

发生分段错误.

c curl popen segmentation-fault

0
推荐指数
1
解决办法
341
查看次数

Python subprocess.call不等待命令执行

我是python的新手,我需要在课程中使用它.我在Freemat/octave/matlab .m文件中开发了解决方案(一种优化算法),并希望从Python调用它(python代码将由一个评分python脚本调用).

.m文件读取名为tmp.data的文件,并将输出写入output.txt.然后,python脚本应该从该输出中读取并将其转换为分级脚本所期望的结果.

所有运行都很好,除了我无法使Python等待对Matlab的调用完成,因此在以下行上生成错误.

这是代码:

#!/usr/bin/python
# -*- coding: utf-8 -*-

from collections import namedtuple
Item = namedtuple("Item", ['index', 'value', 'weight'])

import subprocess
import os
from subprocess import Popen, PIPE

def solve_it(input_data):
    # Modify this code to run your optimization algorithm

    # Write the inputData to a temporay file
    tmp_file_name = 'tmp.data'
    tmp_file = open(tmp_file_name, 'w')
    tmp_file.write(input_data)
    tmp_file.close()

    # call matlab (or any other solver)
    # subprocess.call('matlab -r gp(\'tmp.data\')', shell=1)
    # run=os.system
    # a=run('matlab -r gp(\'tmp.data\')')
    # process = Popen('matlab …
Run Code Online (Sandbox Code Playgroud)

python matlab popen python-2.7

0
推荐指数
1
解决办法
2751
查看次数

防止popen()在stderr上显示错误

我有以下代码来查找我正在使用的Linux发行版的发行版.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{

    return print_osinfo();
}

int print_osinfo()
{
    FILE *fp;
    extern FILE* popen();
    char buffer[128];
    int index = 0;

    memset(buffer,0,sizeof(buffer));
    fp = popen("/etc/centos-release", "r");
    if(!fp)
    {
        pclose(fp);
        fp = popen("/etc/redhat-release", "r");
        if(!fp)
        {
            pclose(fp);
            return 1;
        }
    }
    while(fgets(buffer, sizeof(buffer), fp)!= NULL)
    {
        printf("%s\n",buffer);
    }
    pclose(fp);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

如果我在Ubuntu 14.04上运行上面的代码,我会收到以下错误.

sh: 1: /etc/centos-release: not found
Run Code Online (Sandbox Code Playgroud)

我不明白为什么它不试图打开redhat-release然后返回-1.另外,有没有办法防止上面的错误显示在屏幕上?

c popen stderr

0
推荐指数
1
解决办法
267
查看次数

使用python与bash

import os
ot = os.popen("%s") %"ls"
Run Code Online (Sandbox Code Playgroud)
TypeError: unsupported operand type(s) for %: 'file' and 'str'
Run Code Online (Sandbox Code Playgroud)

我无法弄清楚为什么会发生错误.我的意思是它是纯粹的字符串操作,对吗?任何帮助都可以得到赞赏.

python bash popen

0
推荐指数
1
解决办法
59
查看次数

标签 统计

popen ×10

python ×6

subprocess ×3

c ×2

arguments ×1

bash ×1

curl ×1

fork ×1

go ×1

lua ×1

matlab ×1

python-2.7 ×1

ros ×1

segmentation-fault ×1

ssh ×1

stderr ×1

stdin ×1

windows ×1