sys.argv не передает более одного аргумента - PullRequest
0 голосов
/ 23 января 2019

Существует проект для планирования персонала с использованием AI. У меня проблема при if len(sys.argv)<=1:, sys.argv не передает более 1 аргумента, и только это условие становится истинным, что дает вывод как

'Usage is main [section|sets|instructor|pairs|run] [seed]'

Я хочу, чтобы sys.argv получил 3 аргумента, чтобы я мог видеть, как работает остальная часть программы.

мой код

def main():
    import sys
    import random
    import tableutils
    print(len(sys.argv))
    nbcourse=7
    nbsets=6
    nbinstructor=5
    nbpairs=2
    if len(sys.argv)<=1:
        print('Usage is main [section|sets|instructor|pairs|run] [seed]')
        return
    elif len(sys.argv)>=3:
        random.seed(int(sys.argv[2]))
    S,nbsection=gen_section(nbcourse)
    R=gen_sets(nbsection,nbsets)
    I=gen_instructor(nbinstructor,nbsets,nbcourse,nbpairs)
    P=gen_pairs(nbpairs,nbsection)
    if sys.argv[1]=='section':
        tableutils.printmat(tableutils.wrapmat(S,[],['Id','Course id','Meeting Time']),True,0)
    elif sys.argv[1]=='sets':
        RR=[]
        for i in range(len(R)):
            RR.append([R[i][0],tableutils.set2string(R[i][1])])
        tableutils.printmat(tableutils.wrapmat(RR,[],['Id','Sections']),True,0)
    elif sys.argv[1]=='instructor':
        RI=[]
        for i in range(len(I)):
            RI.append([I[i][0],
                       tableutils.set2string(I[i][1]),
                       tableutils.set2string(I[i][2]),
                       tableutils.set2string(I[i][3]),
                       tableutils.set2string(I[i][4])])
        tableutils.printmat(tableutils.wrapmat(RI,[],['Id','Load','Course weights','Set weights','Pair weights']),True,0)
    elif sys.argv[1]=='pairs':
        RP=[]
        for i in range(len(P)):
            X=[str('(')+str(e[0])+str(' ')+str(e[1])+str(')') for e in P[i][1]]
            RP.append([P[i][0],tableutils.set2string(X)])
        tableutils.printmat(tableutils.wrapmat(RP,[],['Id','Section pairs']),True,0)
    elif sys.argv[1]=='run':
        rc,x,xs,v=solve_model(S,I,R,P)
        #tableutils.printmat(x)
        #print(xs)
        XS=[]
        for i in range(len(xs)):
            XS.append([xs[i][0], 
                       ['{0:2}'.format(e[0])+' : ('+'{0:2}'.format(e[1][0])+' '+'{0:2}'.format(e[1][1])+' '+'{0:2}'.format(e[1][2])+')' for e in xs[i][1]]])
        tableutils.printmat(tableutils.wrapmat(XS,[],['Instructor','Section (WC WR WP)']),True,1)
main()

Я хочу, чтобы это elif len(sys.argv)>=3: условие сбылось, что мне делать? Я запускаю эту программу на pycharm idle

Ответы [ 2 ]

0 голосов
/ 23 января 2019

sys.argv [0] всегда является именем вашей программы.Если переданы дополнительные аргументы, len (sys.argv) будет> 1 с последующими элементами sys.argv, содержащими дополнительные аргументы командной строки.Похоже, что вы запускаете сценарий с 0 аргументами, и он печатает сообщение с указанием параметров необходимых аргументов.Если вы в настоящее время используете

main

, попробуйте запустить

main run 0

или какую-либо другую перестановку предложенных аргументов.

Для передачи аргументов в скрипт при использовании PyCharmсм. этот ответ

0 голосов
/ 23 января 2019

Я выбираю, что вы будете использовать argparse.И, если вы хотите ввести 1 аргумент, вы напишите для проверки 2. если len (sys.argv) <= 2: </p>

Потому что sys.argv [0] - это имя программы.(напр. ~~ .py) Так что у sys.argv всегда есть 1 элемент.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...