wxpython转移参数
有两个脚本,一个用参数(*args)调用另一个,另一个被调用并显示一个表单,显示一个表单工作正常,但没有从调用脚本传输参数。我尝试通过命令行运行被调用的脚本,得到了相同的结果。下面是两个脚本的片段 Python2.7.14 wxPython3.0.2.0-py27赢10wxpython转移参数,wxpython,args,Wxpython,Args,有两个脚本,一个用参数(*args)调用另一个,另一个被调用并显示一个表单,显示一个表单工作正常,但没有从调用脚本传输参数。我尝试通过命令行运行被调用的脚本,得到了相同的结果。下面是两个脚本的片段 Python2.7.14 wxPython3.0.2.0-py27赢10 sy0000.py calling sy0001.py def CallPGM( self, event ): lstParms = ['python', 'sy0001.py'] dctParms = {
sy0000.py calling sy0001.py
def CallPGM( self, event ):
lstParms = ['python', 'sy0001.py']
dctParms = {"pgm_version_id": "ver0000"}
lstArgs = ['ver0000', 'noby']
#os.system("python sy0001.py " + "ver0000") # works but args not transfered
strParms = "python sy0001.py " + "ver0000"
os.system(strParms) # works but args not transfered
#subprocess.Popen(lstParms + lstArgs) # works but args not transfered
#subprocess.Popen('python', 'sy0001.py', 'abcd', 'ver0000', 'noby') # buffer size error
#subprocess.Popen(['python', 'sy0001.py', 'abcd', 'ver0000', 'noby']) # works but args not transfered
subprocess.call(lstParms + lstArgs) # works but args not transfered
#subprocess.call(['python', 'sy0001.py', 'abcd', 'ver0000', 'noby']) # works but args not transfered
#subprocess.call('python', 'sy0001.py', 'abcd', 'ver0000', 'noby') buffer size error
self.Destroy()
sy0001.py called by sy0000.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)
#start the applications
app.MainLoop()
我已经测试了几种调用方法,但结果如下:
sy0001初始化
()
==正常==
{}
==2ok==
没有一个
==parm1ok=
我使用的是win 10 python2.7 wxpython3.0,这些版本必须保留。
如果有人指出我做错了什么,我将不胜感激。或者win 10导致了这种情况?当您向这样的脚本传递参数时,它们存储在
sys.argv
中
尝试替换:
frame = MyFrame(None)
与
您不是在python中调用脚本
,而是将控制权传递给您的操作系统,因此参数只能从sys.argv
关键字参数的概念同时也出现了。
您必须访问在命令行上传递的参数,忽略将作为脚本名称的参数0
import wx
import sys
my_args = sys.argv
class MyFrame(wx.Frame):
def __init__(self, parent, *args, **kwds):
wx.Frame.__init__(self, parent, title="BioInformatics", size=(400,300))
print ("sy0001 init ")
print (args)
print ("==ok=")
print (kwds)
print ("==2ok=")
#Convert args to a list to print out
largs = [elem for i in args for elem in i]
for item in largs:
print (item)
app = wx.App(False)
frame = MyFrame(None, my_args[1:])
frame.Show(True)
app.MainLoop()
命令:
python sy0001.py 123 j=42 66
输出:
sy0001 init
(['123', 'j=42', '66'],)
==ok=
{}
==2ok=
123
j=42
66
谢谢你的建议。我改为MyFram(无,**sys.argv),并收到一个错误,提示“在**之后键入对象参数必须是映射,而不是列表”,因此我改为MyFrame(无,sys.argv)。另一个错误是“参数由名称('id')和位置(2)给出”。我不明白错误的含义。NobySorry,那应该是*sys.argv
而不是**sys.argv
@noby因为你是新来的,答案旁边有一个灰色的勾号,上面有上下箭头。如果答案回答了您的问题,请单击灰色勾号以接受答案。如果答案没有回答问题,但有帮助,请单击向上箭头指示该答案有用。另一方面,如果答案是total tosh,请单击向下箭头,表示它根本没有帮助。我收到了您关于回答答案是否有帮助的消息,但我不知道灰色记号在哪里。如果我知道它在哪里,我会说这个答案完美地解决了我的问题。@noby嗨,在答案的左边你会看到一个向上的图标▲ 签下0和a▼ 签名这些都是用来上下投票的答案。下面是一个灰色的勾号✔ 签名这是用来接受答案的;如果单击它,它将变为绿色。
sy0001 init
(['123', 'j=42', '66'],)
==ok=
{}
==2ok=
123
j=42
66