标签: subprocess

为什么带有shell = True的subprocess.Popen()在Linux与Windows上的工作方式不同?

subprocess.Popen(args, shell=True)用于运行" gcc --version"(仅作为示例)时,在Windows上我们得到:

>>> from subprocess import Popen
>>> Popen(['gcc', '--version'], shell=True)
gcc (GCC) 3.4.5 (mingw-vista special r3) ...
Run Code Online (Sandbox Code Playgroud)

因此,按照我的预期很好地打印出版本.但是在Linux上我们得到了这个:

>>> from subprocess import Popen
>>> Popen(['gcc', '--version'], shell=True)
gcc: no input files
Run Code Online (Sandbox Code Playgroud)

因为gcc还没有收到--version选项.

文档没有明确指出Windows下args应该发生什么,但它确实说,在Unix上,"如果args是一个序列,第一个项目指定命令字符串,任何其他项目将被视为额外的shell参数".恕我直言,Windows方式更好,因为它允许您将Popen(arglist)呼叫视为Popen(arglist, shell=True)一个.

为什么Windows和Linux之间存在差异?

python shell subprocess popen

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

我怎样才能找出为什么subprocess.Popen wait()如果stdout = PIPE会永远等待?

我有一个程序写入stdout和stderr.我想从python运行它,捕获stdout和stderr.我的代码看起来像:

from subprocess import *

p = Popen( exe, shell=TRUE, stdout=PIPE, stderr=PIPE )
rtrncode = p.wait()
Run Code Online (Sandbox Code Playgroud)

对于几个程序,这很好,但是当我添加一个新程序时,新的程序会永远挂起.如果我删除stdout=PIPE,程序将其输出写入控制台并完成,一切都很好.如何确定导致挂起的原因?

在Windows XP上使用python 2.5.该程序不从stdin读取,也没有任何类型的用户输入(即"按键").

python subprocess

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

在新的终端窗口中从python执行终端命令?

这里的目标是在现有shell中的新shell和现有python文件中运行新的python文件.说我有两个文件,aaa.py和bbb.py. 让我们说简单,所有aaa.py都是......

subprocess.call('python bbb.py', shell=True)
Run Code Online (Sandbox Code Playgroud)

......让我们说bbb.py确实是......

print 'It worked'
Run Code Online (Sandbox Code Playgroud)

现在的目标是在终端1中运行aaa.py并让它在终端2中启动bbb.py.我希望下面的命令存在,但无法弄明白.

subprocess.call_in_new_window('python bb.py', shell=True)
Run Code Online (Sandbox Code Playgroud)

python shell terminal subprocess new-window

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

我应该如何从Java应用程序运行NodeJS?

我正在编写一个Java库,实际上是一个Clojure库,但对于这个问题,重要的是它在JVM上运行.这个库需要执行一些JavaScript.我试过Nashorn但我遇到了一些可能难以克服的限制.作为替代方案,我想尝试NodeJS.

我希望我的库是自包含的,不依赖于独立运行NodeJS的系统,因此需要特定的部署机制将Java和NodeJS工件放在正确的位置以便由两个不同的网络服务器拾取.但是,这种方法带来了一些问题.

我将通过HTTP与NodeJS交谈,但我不希望NodeJS打开特定端口.我想找一个随机未使用的,所以没有碰撞.我还想控制来自NodeJS的日志的位置,以便将它们与我的应用程序的其余部分保持一致.最后,我的应用程序应该能够检测到NodeJS何时崩溃并重新运行它或报告错误信息.

什么是最好的方法来解决这个问题?是否有任何Java库以这种方式帮助管理子进程?我应该从NodeJS方面做一些特别的事情(我是NodeJS的新手,我之前从未使用过它).

javascript java subprocess clojure node.js

20
推荐指数
2
解决办法
6622
查看次数

Python子流程,具有实时输入和多个控制台

主要问题

简而言之:我想为我的程序安装两个控制台.一个用于活动用户输入.另一个用于纯日志输出. (工作代码包括已接受的答案在下面的问题文本中,在"编辑-3"部分下面.在"编辑-1"部分和"编辑-2"部分是功能解决方法.)

为此,我有一个主命令行Python脚本,它应该只为日志输出打开一个额外的控制台.为此,我打算将日志输出重定向到第二个控制台的stdin,该日志输出将打印在主脚本的控制台上,我将其作为子进程启动.(我使用subprocess,因为我没有找到任何其他方法来打开第二个控制台.)

问题是,似乎我能够发送到第二个控制台的stdin - 但是,在第二个控制台上没有任何内容被打印出来.

以下是我用于实验的代码(在Windows 10下的PyDev上使用Python 3.4).该函数writing(input, pipe, process)包含将生成的字符串复制到pipevia子进程打开的控制台的as 传递的stdin的部分.函数writing(...)通过类运行writetest(Thread).(我留下了一些代码,我注释掉了.)

import os
import sys
import io
import time
import threading
from cmd import Cmd
from queue import Queue
from subprocess import Popen, PIPE, CREATE_NEW_CONSOLE


REPETITIONS = 3


# Position of "The class" (Edit-2)


# Position of "The class" (Edit-1)


class generatetest(threading.Thread):

    def __init__(self, queue):
        self.output = queue
        threading.Thread.__init__(self)

    def run(self):
        print('run generatetest')
        generating(REPETITIONS, self.output)
        print('generatetest done')

    def getout(self):
        return self.output


class …
Run Code Online (Sandbox Code Playgroud)

python console subprocess input real-time

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

如何从subprocess.Popen.stdout(非阻塞)中读取所有可用数据?

我需要一种方法来读取Popen创建的流中所有当前可用的字符,或者找出缓冲区中剩余的字符数.

Backround:我想用Python远程控制交互式应用程序.到目前为止,我使用Popen创建了一个新的子进程:

process=subprocess.Popen(["python"],shell=True,stdin=subprocess.PIPE,stdout=subprocess.PIPE,stderr=subprocess.PIPE, cwd=workingDir)
Run Code Online (Sandbox Code Playgroud)

(我不是真正启动python,但实际的交互式界面是类似的.)目前我读取1个字节,直到我检测到进程已到达命令提示符:

output = ""
while output[-6:]!="SCIP> ":
    output += process.stdout.read(1)
    sys.stdout.write(output[-1])
return output
Run Code Online (Sandbox Code Playgroud)

然后我开始一个冗长的计算process.stdin.write("command\n").我的问题是,我无法检查计算是否已经完成,因为我无法检查流中的最后一个字符是否是提示.read()或者read(n)阻止我的线程,直到它到达EOF,它永远不会,因为交互式程序在被告知之前不会结束.以上述循环方式查找提示也不起作用,因为提示只会在计算后发生.

理想的解决方案将允许我从流中读取所有可用字符,并立即返回空字符串,如果没有任何内容可读.

python subprocess

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

Python无法与Minecraft服务器的子进程通信

我正在尝试为Minecraft服务器编写处理程序/控制器.我的问题是,我似乎无法通过写作和阅读来正常工作.当客户端发出使用服务器类方法的命令时,serverComMinecraft服务器的文本/日志开始进入Python窗口/ Python控制台,并且连接的客户端挂起.此外,似乎在我使用之后Popen,Minecraft服务器在我写入服务器(aka serverCom方法)之前并没有真正启动.如果有人想知道,则Popen转到打开.jar文件的批处理文件.这是在Windows XP上.

import subprocess
import os
import configobj
import socket
import threading
from time import sleep

config = configobj.ConfigObj("config.ini")
cHost = config["hostip"]
cPort = int(config["hostport"])
cBuffer = int(config["serverbuffer"])
cClients = int(config["numberofclients"])
cPassword = config["password"]

class server(object):
    def __init__(self):
        self.process = False
        self.folder = "C:\\servers\\minecraft-danny"
        self.max = configobj.ConfigObj("%s\\simpleserver.properties"%self.folder)["maxPlayers"]

    def serverStart(self):
        if not self.process:
            self.process = subprocess.Popen("java -Xmx1024m -Xms1024m -jar minecraft_server.jar nogui", cBuffer, None, subprocess.PIPE, subprocess.PIPE, subprocess.STDOUT, cwd = self.folder)
            return True
        return …
Run Code Online (Sandbox Code Playgroud)

python subprocess minecraft

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

subprocess.wait()没有等待Popen进程完成(使用线程时)?

subprocess.Popen()我使用线程让我们同时运行它们从我的python脚本生成同一个应用程序的几个实例时,我遇到了一些问题.在每个线程中,我使用popen()调用运行应用程序,然后我等待它通过调用完成wait().问题似乎是wait()-call实际上并不等待进程完成.我只使用一个线程进行实验,并在进程启动时和完成时打印出文本消息.所以线程函数看起来像这样:

def worker():
    while True:
        job = q.get() # q is a global Queue of jobs
        print('Starting process %d' % job['id'])
        proc = subprocess.Popen(job['cmd'], shell=True)
        proc.wait()
        print('Finished process %d' % job['id'])
        job.task_done()
Run Code Online (Sandbox Code Playgroud)

但即使我只使用一个线程,它也会在出现任何"完成进程..."消息之前打印出几个"正在启动进程..."消息.有wait()没有实际上没有等待的情况?我有几个不同的外部应用程序(C++控制台应用程序),它们将同时运行多个实例,对于其中一些我的代码可以工作,但对于其他实例,它不会.外部应用程序是否存在某些问题会以某种方式影响调用wait()?创建线程的代码如下所示:

for i in range(1):
    t = Thread(target=worker)
    t.daemon = True
    t.start()
q.join() # Wait for the queue to empty
Run Code Online (Sandbox Code Playgroud)

更新1:我还应该补充一点,对于某些外部应用程序,我有时会得到proc.returncode-1073471801 的返回码().例如,其中一个外部应用程序将给出前两次Popen调用的返回代码,但不是后两个(当我有四个作业时).

更新2:为了清理,现在我在队列中有四个作业,这是四个不同的测试用例.当我运行我的代码时,对于其中一个外部应用程序,前两个 - Popen调用生成返回代码-1073471801.但是如果我打印出Popen调用的确切命令,并在命令窗口中运行它,它会毫无问题地执行.

解决了! 我设法解决了我遇到的问题.我认为问题在于我缺乏线程编程的经验.我错过了这样一个事实:当我创建了我的第一个工作线程时,他们会一直活着直到python脚本退出.错误的是,每次我将新项目放入队列时,我都会创建更多的工作线程(我会为每个要运行的外部程序批量执行此操作).所以当我进入第四个外部应用程序时,我有四个线程同时运行,即使我只认为我有一个.

python multithreading subprocess popen

19
推荐指数
3
解决办法
5万
查看次数

从python中运行交互式命令

我有一个脚本,我想在python(2.6.5)中运行,遵循以下逻辑:

  • 提示用户输入密码.看起来像("输入密码:")(*注意:输入不回显到屏幕)
  • 输出无关信息
  • 提示用户回复("Blah Blah filename.txt blah blah(Y/N)?:")

最后一个提示行包含我需要解析的文本(filename.txt).提供的响应无关紧要(只要我可以解析该行,程序实际上可以在不提供响应的情况下退出)

我的要求有点类似于在python脚本中包装交互式命令行应用程序,但是那里的响应看起来有点令人困惑,即使OP提到它不适合他,我仍然会挂起.

通过环顾四周,我得出的结论subprocess是这样做的最佳方式,但我遇到了一些问题.这是我的Popen系列:

p = subprocess.Popen("cmd", shell=True, stdout=subprocess.PIPE, 
stderr=subprocess.STDOUT, stdin=subprocess.PIPE)
Run Code Online (Sandbox Code Playgroud)
  • 当我打电话给read()readline()打开时stdout,提示是打印机到屏幕并挂起.

  • 如果我叫write("password\n")stdin,提示被写入屏幕,它挂起.write()未写入文本(我没有光标移动新行).

  • 如果我调用p.communicate("password\n"),与write()相同的行为

我在这里寻找一些关于输入的最佳方式的想法,stdin如果你感觉很慷慨,可能如何解析输出中的最后一行,尽管我最终可能会想到这一点.

python stdin subprocess interactive stdout

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

Python subprocess.call一个bash别名

在工作中有一个列出已完成任务的脚本.这是由其他人编写的,并通过网络托管.我的.bashrc中有一个别名,它调用了这个脚本,有很多标志等等,我想编写一个python脚本,每隔几分钟调用一次这样的别名,这样我就可以打开一个带有更新统计数据的shell.但是,subprocess.call("myAlias")失败了.我对python仍然相当新,我正在努力解决这个问题.

from subprocess import call

def callAlias():
    call("myAlias")

callAlias()
Run Code Online (Sandbox Code Playgroud)

我计划增加更多,但我在第一步遇到障碍.:P

我会发布更多,但有很多敏感的机密内容我必须要小心.对不起,代码模糊,缺少错误输出.

python bash subprocess

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