我正在尝试构建一个允许重复此操作的函数(它阻止控制台在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)
因此,我定义了以下函数:
^{pr2}$但是当我这样叫它noWinConsole(['myprogram.exe', '-P', arg], stdout=someFile)
时,我得到了一个错误,因为stdout=somefile
:
TypeError: noWinConsole() got an unexpected keyword argument 'stdout'
我该怎么解决这个问题?在
函数
noWinConsole
只需要一个参数,当您调用它时:您正在传递两个参数:
stdout = someFile
如何解决这个问题?
您可以使用两种方法:
定义获取Kargs的方法。请注意,您没有使用参数
stdout
只需传递一个参数即可调用函数:
noWinConsole
只是一个包装器,它只需要一个参数,program
。因此,当您给它两个参数(program
作为第一个位置参数,然后是用于subprocess
调用的关键字参数stdout
)时,它会变得异常。在幸运的是,有一个标准的习惯用法可以生成一个包装器,它将任何一组参数传递给一个内部函数。它使用^{} 和^{} 符号来打包/解包参数。在
基本上就是这样。函数定义中的
*
运算符接受所有输入的位置参数,并将它们打包到一个名为args
的元组中。然后,当您调用subprocess
,*
运算符将该元组解包,并以相同的顺序将这些相同的参数传递给下一个函数。在**
运算符的工作原理基本相同,只是它捕捉像stdout='foo.txt'
这样的关键字参数并将它们全部打包到一个像{'stdout':'foo.txt'}
这样的字典中。然后,当您在调用内部函数中再次使用**
时,该字典将被解包并转换回关键字参数。在相关问题 更多 >
编程相关推荐