аргумент передачи wxpython - PullRequest
0 голосов
/ 11 мая 2018

Есть два скрипта, один вызывает другой с аргументами (* args), а другой вызывается и отображает форму, отображение формы работает нормально, но никакие аргументы не передаются из вызывающего скрипта.Я попытался запустить вызываемый скрипт через командную строку и получил тот же результат.Здесь фрагмент обоих сценариев python 2.7.14 wxPython3.0.2.0-py27 win 10

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 init () == ok == {} == 2ok == Нет == parm1ok =

Я использую win 10 python2.7 wxpython3.0, и эти версии должны остаться.Признателен, если кто-то указывает, что я делаю неправильно.Или победа 10 вызывает это?

Ответы [ 2 ]

0 голосов
/ 11 мая 2018

Вы не вызываете скрипт within 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
0 голосов
/ 11 мая 2018

Когда вы передаете такие аргументы в скрипт, они сохраняются в sys.argv.

Попробуйте заменить:

frame = MyFrame(None) 

на

import sys
frame = MyFrame(None, *sys.argv)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...