等号和函数参数问题

2024-10-01 22:36:11 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试构建一个允许重复此操作的函数(它阻止控制台在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'

我该怎么解决这个问题?在


Tags: 函数ifwindowsstdoutargcallexesystem
2条回答

函数noWinConsole只需要一个参数,当您调用它时:

noWinConsole(['myprogram.exe', '-P', arg], stdout=someFile)

您正在传递两个参数:

  • 名单
  • 关键字参数stdout = someFile

如何解决这个问题?

您可以使用两种方法:

  • 定义获取Kargs的方法。请注意,您没有使用参数stdout

    def noWinConsole(program, **kwargs):
    
  • 只需传递一个参数即可调用函数:

    noWinConsole(['myprogram.exe', '-P', arg])
    

noWinConsole只是一个包装器,它只需要一个参数,program。因此,当您给它两个参数(program作为第一个位置参数,然后是用于subprocess调用的关键字参数stdout)时,它会变得异常。在

幸运的是,有一个标准的习惯用法可以生成一个包装器,它将任何一组参数传递给一个内部函数。它使用^{}^{}符号来打包/解包参数。在

def noWinConsole(*args, **kwargs):
    # Other stuff here as needed
    subprocess.call(*args, **kwargs)

基本上就是这样。函数定义中的*运算符接受所有输入的位置参数,并将它们打包到一个名为args的元组中。然后,当您调用subprocess*运算符将该元组解包,并以相同的顺序将这些相同的参数传递给下一个函数。在

**运算符的工作原理基本相同,只是它捕捉像stdout='foo.txt'这样的关键字参数并将它们全部打包到一个像{'stdout':'foo.txt'}这样的字典中。然后,当您在调用内部函数中再次使用**时,该字典将被解包并转换回关键字参数。在

相关问题 更多 >

    热门问题