输出由子进程调用命令行?(output the command line called by sub

2019-07-19 19:09发布

我使用subprocess.Popen通话,而在另一个问题,我发现我已经被误解的Python是如何生成的参数在命令行。

我的问题
有没有办法找出实际的命令行了?

示例代码: -

proc = subprocess.popen(....)
print "the commandline is %s" % proc.getCommandLine()

你会怎么写getCommandLine

Answer 1:

这取决于Python的版本所使用。 在Python3.3中,ARG被保存在proc.args

proc = subprocess.Popen(....)
print("the commandline is {}".format(proc.args))

在Python2.7, 在args没有保存 ,它只是传递到像其他功能_execute_child 。 所以,在这种情况下,要获得命令行的最好方法是保存它时,你就会明白:

proc = subprocess.Popen(shlex.split(cmd))
print "the commandline is %s" % cmd

请注意,如果你有一个参数(如返回的东西类型列表 shlex.split(cmd)那么你就可以收回命令行字符串, cmd使用无证功能subprocess.list2cmdline

In [14]: import subprocess

In [15]: import shlex

In [16]: cmd = 'foo -a -b --bar baz'

In [17]: shlex.split(cmd)
Out[17]: ['foo', '-a', '-b', '--bar', 'baz']

In [18]: subprocess.list2cmdline(['foo', '-a', '-b', '--bar', 'baz'])
Out[19]: 'foo -a -b --bar baz'


Answer 2:

正确回答我的问题实际上是不存在的命令行。 子的一点是,它通过IPC做的一切。 该list2cmdline确实亲如可以预期的,但在现实中做的最好的事情就是看“ARGS”列表,只知道将在调用程序的argv进行。



Answer 3:

美丽的和可扩展的方法

我一直在使用这样的事情:

#!/usr/bin/env python3

import os
import shlex
import subprocess
import sys

def run_cmd(cmd, cwd=None, extra_env=None, extra_paths=None, dry_run=False):
    if extra_env is None:
        extra_env = {}
    newline_separator = ' \\\n'
    out = []
    kwargs = {}
    env = os.environ.copy()

    # cwd
    if 'cwd' is not None:
        kwargs['cwd'] = cwd

    # extra_env
    env.update(extra_env)
    for key in extra_env:
        out.append('{}={}'.format(shlex.quote(key), shlex.quote(extra_env[key])) + newline_separator)

    # extra_paths
    if extra_paths is not None:
        path = ':'.join(extra_paths)
        if 'PATH' in env:
            path += ':' + env['PATH']
        env['PATH'] = path
        out.append('PATH="{}:${{PATH}}"'.format(':'.join(extra_paths)) + newline_separator)

    # Command itself.
    for arg in cmd:
        out.append(shlex.quote(arg) + newline_separator)

    # Print and run.
    kwargs['env'] = env
    print('+ ' + '  '.join(out) + ';')
    if not dry_run:
        subprocess.check_call(cmd, **kwargs)

run_cmd(
    sys.argv[1:],
    cwd='/bin',
    extra_env={'ASDF': 'QW ER'},
    extra_paths=['/some/path1', '/some/path2']
)

样品运行:

./a.py echo 'a b' 'c d' 

输出:

+ ASDF='QW ER' \
  PATH="/some/path1:/some/path2:${PATH}" \
  echo \
  'a b' \
  'c d' \
;
a b c d

功能摘要:

  • 使巨大的命令行可读每行一个选项
  • 添加+到命令,如sh -x ,因此用户可以从它们的输出容易区分命令
  • 显示cd ,以及额外的环境变量,如果给他们的命令。 如果给这些只印,产生一个最小的外壳命令。

所有这一切都可以让用户轻松手动复制命令,如果事情无法运行它们,或者看看是怎么回事。

测试在Python的3.5.2,Ubuntu的16.04。 GitHub的上游 。



文章来源: output the command line called by subprocess?