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

python 3: subprocessing a python script that uses argparse

我为自己做了一个小工具 "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 作为子进程正确执行,但这次命令行有些被忽略,即使指定。 无论您指定了不同的值,都将始终使用默认值(例如“--track”选项的“10m”)。

我备注:./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忽略./sa_gui.pyw

有什么帮助吗?


搜索:

:问题是关于如何子处理python脚本和实际使用的python版本。这里的问题集中在 subrprocessed python script

使用的 argparse

Not useful:我不是在这里问如何捕获子进程的输出

Not useful:同理(2)

解决方案

我可以在 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']