Python2.7+wxPython3.0脚本调用传参失败问题排查请求
问题:Python脚本调用无法传递参数(Windows10 + Python2.7 + wxPython3.0)
背景
你在Windows10环境下用Python2.7和wxPython3.0,尝试让sy0000.py调用sy0001.py,不管用os.system还是subprocess的各种写法,sy0001.py的窗口能正常显示,但始终接收不到传递的参数——甚至直接命令行运行sy0001.py加参数也没反应。
代码片段
调用方 sy0000.py
def CallPGM( self, event ): lstParms = ['python', 'sy0001.py'] dctParms = {"pgm_version_id": "ver0000"} lstArgs = ['ver0000', 'noby'] # 各种尝试的调用方式,都没成功传递参数 strParms = "python sy0001.py " + "ver0000" os.system(strParms) subprocess.call(lstParms + lstArgs) self.Destroy()
被调用方 sy0001.py
import wx class MyFrame( wx.Frame ): def __init__( self, parm1, *args, **kargs ): wx.Frame.__init__ ( self, parm1, id = wx.ID_ANY, title = u"BioInformatics", pos = wx.DefaultPosition, size = wx.Size( 1200,700 ), style = wx.DEFAULT_FRAME_STYLE|wx.TAB_TRAVERSAL, *args, **kargs ) print "sy0001 init " print args print "==ok=" print kargs print "==2ok=" print parm1 print "==parm1ok=" app = wx.App(False) frame = MyFrame(None) frame.Show(True) app.MainLoop()
测试输出
所有调用方式的输出都一样:
sy0001 init () ==ok== {} ==2ok== None ==parm1ok=
问题根源&解决办法
根本原因:没读取命令行参数
这和Windows10完全没关系!你在调用脚本里传了参数,但sy0001.py从头到尾没去读取Python的命令行参数列表sys.argv——所有通过命令行传递的参数都存在这个列表里,你直接实例化MyFrame(None),当然拿不到任何参数。
另外还有个小问题:你的MyFrame.__init__参数顺序不符合wxPython规范,把业务参数放在了父窗口参数的位置,容易混淆wx的初始化逻辑。
修改后的sy0001.py
import wx import sys # 必须导入sys才能读取命令行参数 class MyFrame( wx.Frame ): def __init__( self, parent, *args, **kwargs ): # 父窗口参数放在第一位,符合wxPython的初始化规范 wx.Frame.__init__ ( self, parent, id = wx.ID_ANY, title = u"BioInformatics", pos = wx.DefaultPosition, size = wx.Size( 1200,700 ), style = wx.DEFAULT_FRAME_STYLE|wx.TAB_TRAVERSAL ) # 读取并处理命令行参数:sys.argv[0]是脚本名,后面的是传递的参数 print "sy0001 init " print "收到的命令行参数:", sys.argv[1:] # 可以根据需要提取参数 if len(sys.argv) > 1: self.version_id = sys.argv[1] print "版本ID:", self.version_id if len(sys.argv) > 2: self.user_name = sys.argv[2] print "用户名:", self.user_name app = wx.App(False) frame = MyFrame(None) # 父窗口传None,正确符合wx要求 frame.Show(True) app.MainLoop()
验证效果
现在不管你用哪种调用方式,比如:
subprocess.call(['python', 'sy0001.py', 'ver0000', 'noby'])
运行后sy0001.py会输出:
sy0001 init 收到的命令行参数: ['ver0000', 'noby'] 版本ID: ver0000 用户名: noby
额外提示
- 你之前尝试的
os.system和subprocess写法本身都是能传递参数的,只是被调用脚本没读取而已,和系统无关。 - Python2.7的
sys.argv在Windows下能正常处理字符串参数,不需要额外编码解码。 - wxPython窗口类的第一个初始化参数必须是父窗口对象,业务参数别放在这个位置,单独用
sys.argv读取更清晰。
内容的提问来源于stack exchange,提问作者noby
相关产品推荐
相关产品推荐

