python 3:对使用argparse的python脚本进行子处理

时间:2016-01-17 08:10:24

标签: python-3.x subprocess

我做了一点实用工具" sa.py"对于我自己从命令行工作。它要求FFMPEG做真正的工作。这个sa.py接受一些选项:

#! /usr/bin/env python3
# ...
import argparse
# ...
parser = argparse.ArgumentParser(description='...')
parser.add_argument(
    '--track',
    default='10m',
    dest='track',
    help="..."
)
# ...
args = parser.parse_args()

如果我自己运行./sa.py它运行正常(它正确地看到所有命令行选项都已通过)。 当我尝试开发一个启动./sa.py作为子进程的python GUI时,麻烦就开始了。 gui启动子进程,sa.py作为子进程正确执行,但这次命令行有些被忽略,即使指定了。 无论您指定了不同的值,都将始终使用默认值(示例" 10m"" - track"选项)。

我说:./ sa.py本身可以正确处理自己的命令行 但是./sa.py作为" GUI"的子进程运行时,将看不到命令​​行选项。 python脚本

所以问题主要集中在sa_gui.pyw中subprocess.call的用法,但我无法猜出问题出在哪里:

# this piece of code is included in a class on a python script
# that uses tk gui
# self.track, self.delta etc are all tkinter.StringVar() variables
# that you could change on the proper tkinter.Entry "widget"
cmd = [ os.path.realpath('./sa.py'),
        '--track', self.track.get(),
        '--delta', self.delta.get(),
        '--min', self.minimal.get(),
        '--balance', self.balance.get()]
# ...
subprocess.call(cmd, shell=True)

如果我调试" cmd"值,它包含所需的所有信息:

  • (正确)./sa.py脚本的位置以启动
  • - 轨道
  • [track_value]
  • - 三角
  • [delta_value]

......等等。

所以我无法确定问题所在以及为什么命令行选项在。subsaessed购买时被./sa.py忽略./sa_gui.pyw

有任何帮助吗?

搜索:

Not useful:问题与如何处理python脚本和实际使用的python版本有关。这里的问题集中在subrprocessed python脚本

使用的argparse上

Not useful:我这里没有问如何捕获子进程的输出

Not useful:出于与(2)

相同的原因

1 个答案:

答案 0 :(得分:1)

解决方案

我可以通过以下方式在OSX上重现您的问题:

subprocess.call(cmd, shell=True)

没有shell=True

subprocess.call(cmd)

测试代码

sa.py

#! /usr/bin/env python3

import argparse
import sys


parser = argparse.ArgumentParser(description='...')
parser.add_argument(
    '--track',
    default='10m',
    dest='track',
    help="..."
)
args = parser.parse_args()
print(args)
print(sys.argv)

call_sa.py

import os
import subprocess

cmd = [os.path.realpath('./sa.py'), '--track', '12']

print('shell False')
subprocess.call(cmd)
print()
print('shell True')
subprocess.call(cmd, shell=True)

输出:

python call_sa.py 
shell False
Namespace(track='12')
['/Users/mike/tmp/sa.py', '--track', '12']

shell True
Namespace(track='10m')
['/Users/mike/tmp/sa.py']