запуск сценария python в командной строке не выводит вывод - PullRequest
1 голос
/ 18 мая 2019

Я хочу сделать скрипт на python, а затем запустить его из командной строки.Сценарий называется test.py и команда для его запуска:

python3 test.py John Jackson

Вот ожидаемый результат:

John Jackson

А вот сценарий Python, который я сделал:

class person:

    def __init__(self, first, last):
        self.firstname = first
        self.lastname = last

    def get_first(self):
        return self.firstname

    def get_last(self):
        return self.lastname

import argparse

def main():
    parser = argparse.ArgumentParser()
    parser.add_argument('first')
    parser.add_argument('last')
    args = parser.parse_args()
    c1 = person(args.first, args.last)
    print(c1)

Но проблема в том, что когда я запускаю скрипт из командной строки, используя упомянутую команду, он ничего не возвращает.Вы знаете, как это исправить и получить ожидаемый результат?

Ответы [ 3 ]

2 голосов
/ 18 мая 2019

Вы определили свою main() функцию, но не вызывали ее.

Добавьте это в конец вашего скрипта:

if __name__ == "__main__":
    main()

См. Что делает if __name__ == “__main__”:? .

Тогда c1 - это экземпляр person, который будет печатать:

$ python3 test.py John Jackson
<__main__.person object at 0x104907ef0>

Вам нужно вызвать get_first() и get_last(), чтобы получитьправильный вывод:

print(c1.get_first(), c1.get_last())
1 голос
/ 18 мая 2019

Я не уверен, что вы вызываете свою основную функцию при запуске скрипта.

Добавить

if __nam__ == "__main__":
    main()

И переопределить __str__ функцию класса персонажа для печати имени и фамилии при передаче класса в качестве аргумента print.

def __str__(self):
    return self.firstname + ' ' + self.lastname

Весь код выглядит так

import argparse

class person:

    def __init__(self, first, last):
        self.firstname = first
        self.lastname = last

    def get_first(self):
        return self.firstname

    def get_last(self):
        return self.lastname

    def __str__(self):
        return self.firstname + ' ' + self.lastname

def main():
    parser = argparse.ArgumentParser()
    parser.add_argument('first')
    parser.add_argument('last')
    args = parser.parse_args()
    c1 = person(args.first, args.last)
    print(c1)

if __name__ == '__main__':
    main()
0 голосов
/ 18 мая 2019

Ваш сценарий излишне сложный , гораздо ( намного ) более простой способ достичь этого - использовать свойство argv sys Затем модуль разделяет аргумент (строка), используя split, например:

import sys

name = sys.argv[1].split(" ")

if len(name) != 2:
  raise ValueError("Invalid first and last name, try using \"John Jackson\" instead.")

[first_name, last_name] = name
print(first_name, last_name)

Вам даже не нужно выдавать ошибку:

import sys

name = sys.argv[1].split(" ")

if len(name) == 2:
  [first_name, last_name] = name
  print(first_name, last_name)

Затем, когда вы запустите скрипт следующим образом:

python3 filename.py "John Jackson"

Вы должны получить следующий вывод:

John Jackson

Удачи.

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