相关疑难解决方法(0)

子进程中'shell = True'的实际含义

我用subprocess模块调用不同的进程.但是,我有一个问题.

在以下代码中:

callProcess = subprocess.Popen(['ls', '-l'], shell=True)
Run Code Online (Sandbox Code Playgroud)

callProcess = subprocess.Popen(['ls', '-l']) # without shell
Run Code Online (Sandbox Code Playgroud)

两者都有效.阅读文档后,我开始知道这shell=True意味着通过shell执行代码.这意味着在缺席的情况下,该过程将直接启动.

那么我应该更喜欢我的情况 - 我需要运行一个进程并获得其输出.从shell内部或外部调用它有什么好处.

python subprocess

236
推荐指数
5
解决办法
14万
查看次数

如何使用subprocess.Popen通过管道连接多个进程?

如何使用Python subprocess模块执行以下shell命令?

echo "input data" | awk -f script.awk | sort > outfile.txt
Run Code Online (Sandbox Code Playgroud)

输入数据将来自一个字符串,所以我实际上并不需要echo.我已经走到这一步了,任何人都可以解释我是如何通过它来解决的sort吗?

p_awk = subprocess.Popen(["awk","-f","script.awk"],
                          stdin=subprocess.PIPE,
                          stdout=file("outfile.txt", "w"))
p_awk.communicate( "input data" )
Run Code Online (Sandbox Code Playgroud)

更新:请注意,虽然下面接受的答案实际上没有回答问题,但我相信S.Lott是对的,最好避免首先解决这个问题!

python subprocess pipe

52
推荐指数
4
解决办法
5万
查看次数

新手python子进程:"写入错误:断管"

感谢以下有用的建议:

所以我似乎已经修好了

  1. 将命令分离为对Popen的单独调用
  2. stderr = subprocess.PIPE作为每个Popen链的参数.

新代码:

import subprocess
import shlex
import logging

def run_shell_commands(cmds):
    """ Run commands and return output from last call to subprocess.Popen.
        For usage see the test below.
    """
    # split the commands
    cmds = cmds.split("|")
    cmds = list(map(shlex.split,cmds))

    logging.info('%s' % (cmds,))

    # run the commands
    stdout_old = None
    stderr_old = None
    p = []
    for cmd in cmds:
        logging.info('%s' % (cmd,))
        p.append(subprocess.Popen(cmd,stdin=stdout_old,stdout=subprocess.PIPE,stderr=subprocess.PIPE))
        stdout_old = p[-1].stdout
        stderr_old = p[-1].stderr
    return p[-1]


pattern = '"^85567      "'
file …
Run Code Online (Sandbox Code Playgroud)

python subprocess popen

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

'yes'与子进程通信报告错误()

我使用以下函数在Python中运行命令:

def run_proc(cmd):
    child = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
    stdout, stderr = child.communicate()
    returncode = child.returncode
    return stdout, stderr, returncode
Run Code Online (Sandbox Code Playgroud)

它一直工作正常,但现在我正在尝试使用该yes程序将输出管道输出到stdin.我正在尝试运行的命令如下:

yes '' | apt-get -y -o Dpkg::Options::="--force-confdef" -o Dpkg::Options::="--force-confold" dist-upgrade
Run Code Online (Sandbox Code Playgroud)

但我相信它可以用一般的例子代替,例如:

yes | head -3 | cat
Run Code Online (Sandbox Code Playgroud)

我的问题是,如果我尝试运行其中的任何命令yes |,上面的subprocess.Popen将包含错误消息:

yes: standard output: Broken pipe
yes: write error
Run Code Online (Sandbox Code Playgroud)

对我来说,似乎管道仍然可以工作,从yes | head -3 | cat答案中可以看出:y y y.

我有以下问题:

  1. 是的管道是否仍然可用,即使是报告错误?
  2. 我该如何解决?

python linux shell command-line subprocess

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

标签 统计

python ×4

subprocess ×4

command-line ×1

linux ×1

pipe ×1

popen ×1

shell ×1