在 python 中我打开了 4 个子进程。现在,当 python 脚本中出现新请求时,我想终止所有先前的进程。
我正在使用 python 2.7 和 windows 7 操作系统。
谢谢,
(注意)不是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) 我目前正在研究为 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
传递给 …
我需要为主机上的给定 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 …
我需要具有基本上模拟用户使用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执行几个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)
如果我运行该程序,它仍会提示并要求输入。如何自动响应提示?谢谢。
我可以得到以下工作:
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)
发生分段错误.
我是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) 我有以下代码来查找我正在使用的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.另外,有没有办法防止上面的错误显示在屏幕上?
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)
我无法弄清楚为什么会发生错误.我的意思是它是纯粹的字符串操作,对吗?任何帮助都可以得到赞赏.