Как os.popen может принять аргумент извне для запуска другого скрипта

Я пытаюсь написать программу Python CLI, используя модуль Python CMD. Когда я пытаюсь выполнить другой скрипт Python в моей программе CLI, моя цель состоит в том, чтобы у меня был какой-то скрипт Python в другой папке и программа CLI в другой папке. Я пытаюсь выполнить эти сценарии Python с помощью программы CLI.

Ниже приведен метод os.popen, используемый для выполнения другого скрипта, в котором находится программа CLI:

import cmd
import os
import sys

class demo(cmd.Cmd):

   def do_shell(self,line,args):
     """hare is function to execute the other script"""
    output = os.popen('xterm -hold -e python %s' % args).read()
    output(sys.argv[1])

def do_quit(self,line):

    return True

if __name__ == '__main__':
    demo().cmdloop()

а заяц это ошибка

(Cmd) shell demo-test.py
Traceback (most recent call last):
File "bemo.py", line 18, in <module>
demo().cmdloop()
File "/usr/lib/python2.7/cmd.py", line 142, in cmdloop
stop = self.onecmd(line)
File "/usr/lib/python2.7/cmd.py", line 221, in onecmd
return func(arg)
TypeError: do_shell() takes exactly 3 arguments (2 given)

есть некоторая ссылка на другую программу командной строки cmd 1 = cmd - Создать командно-ориентированные процессоры команд2 = Консоль, созданная с помощью объекта Cmd (рецепт Python)

и некоторые снимки экрана для получения дополнительной информации: введите описание изображения здесь

Пожалуйста, запустите приведенный выше код в вашей системе.

1 ответ

Решение

Как указано в документе:

https://pymotw.com/2/cmd/index.html

do_shell определяется так:

do_shell(self, args):

Но вы определяете это как

do_shell(self, line, args):

Я думаю, что предполагаемое использование - это определить, как указано в документации.

Я запустил твой код и последовал твоему примеру. Я повторил вашу ошибку. Затем я, как указано в документации для do_shell, изменил метод на ожидаемый:

do_shell(self, args):

Оттуда sys модуль отсутствовал, поэтому вам также необходимо импортировать его (если только вы не скопировали его из источника). После этого я получил ошибку для индекса вне диапазона, вероятно, из-за ожидания передачи дополнительных параметров.

Кроме того, поскольку вы говорите о скриптах Python, я не вижу необходимости в добавляемых вами дополнительных командах, я просто изменил строку на следующую:

output = os.popen('python %s' % args).read()

Однако, если есть конкретная причина, по которой вам нужна команда xterm, вы, вероятно, можете вернуть ее обратно, и она будет работать для вашего конкретного случая.

Я также не видел варианта использования для этого:

output(sys.argv[1])

Я прокомментировал это. Я запустил ваш код, и все заработало. Я создал тестовый файл, который просто напечатал, и он успешно работал.

Итак, код на самом деле выглядит так:

def do_shell(self, args):
    """hare is function to execute the other script"""
    output = os.popen('python %s' % args).read()
    print output

Полный код должен выглядеть так:

import cmd
import os
import sys

class demo(cmd.Cmd):

    def do_shell(self, args):
        """hare is function to execute the other script"""
        output = os.popen('python %s' % args).read()
        print output

    def do_quit(self,line):

        return True

if __name__ == '__main__':
    demo().cmdloop()
Другие вопросы по тегам