我正在尝试构建一个允许重复此操作的函数(它阻止控制台在Windows中打开):
if platform.system() == 'Windows':
startupinfo = subprocess.STARTUPINFO()
startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW
subprocess.call(['myprogram.exe', '-P', arg],
stdout=someFile, startupinfo=startupinfo)
else:
subprocess.call(['myprogram.exe', '-P', arg], stdout=someFile)
因此我定义了以下功能:
def noWinConsole(program):
if platform.system() == 'Windows':
startupinfo = subprocess.STARTUPINFO()
startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW
subprocess.call(program, startupinfo=startupinfo)
else:
subprocess.call(program)
但是当我将其称为noWinConsole(['myprogram.exe', '-P', arg], stdout=someFile)
时,由于stdout=somefile
我收到错误:
TypeError: noWinConsole() got an unexpected keyword argument 'stdout'
我该如何解决这个问题?
答案 0 :(得分:3)
noWinConsole
只是一个包装器,因为它只需要一个参数program
。因此,当你给它两个参数(program
作为第一个位置参数,然后是用于stdout
调用的关键字参数subprocess
)时,它就会变得怪异。
幸运的是,有一个标准习惯用于生成一个包装器,它将任何参数集传递给内部函数。它使用*
和**
表示法进行参数打包/解包。
def noWinConsole(*args, **kwargs):
# Other stuff here as needed
subprocess.call(*args, **kwargs)
这基本上是这样的。函数定义中的*
运算符获取所有输入位置参数,并将它们打包到名为args
的元组中。然后,当您调用subprocess
时,*
运算符解包该元组,将相同的参数传递给下一个函数。
**
运算符的工作方式基本相同,只是它捕获stdout='foo.txt'
之类的关键字参数,并将所有这些参数打包到像{'stdout':'foo.txt'}
这样的字典中。在您对内部函数的调用中再次使用**
时,此字典将被解压缩并转换回关键字参数。
答案 1 :(得分:1)
函数noWinConsole
只需要一个参数,当你调用它时:
noWinConsole(['myprogram.exe', '-P', arg], stdout=someFile)
您正在传递两个参数:
stdout = someFile
如何解决此问题?
你可以这两种方式:
定义获取kwargs的方法。请注意,您没有使用参数stdout
def noWinConsole(program, **kwargs):
调用函数只传递一个参数:
noWinConsole(['myprogram.exe', '-P', arg])