我做了一点实用工具" 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"值,它包含所需的所有信息:
......等等。
所以我无法确定问题所在以及为什么命令行选项在。subsaessed购买时被./sa.py忽略./sa_gui.pyw
有任何帮助吗?
搜索:
Not useful:问题与如何处理python脚本和实际使用的python版本有关。这里的问题集中在subrprocessed python脚本
使用的argparse上Not useful:我这里没有问如何捕获子进程的输出
Not useful:出于与(2)
相同的原因答案 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']