Python: ответ на запросы командной строки

Я пытаюсь использовать Python для взаимодействия с другой программой через командную строку. Основная проблема, с которой я сталкиваюсь, - это конкретный вызов с несколькими последующими запросами. Первоначально вызов командной строки запрашивает имя проекта, а затем переходит к запросу, хочу ли я просмотреть какие-либо подпапки проекта. Мне нужно ответить y / n на каждый из них по порядку, и ответ на каждый, к сожалению, не все y или n. Кроме того, я не могу знать ответ на вопрос, не прочитав отдельные подсказки, поэтому я не могу отправить блок «у»s или 'n'все сразу.

Это вызов командной строки:

si viewproject

После ввода команды командная строка предлагает:

Введите название проекта:

И пример ответа будет:

Введите название проекта: c: /test.pj

После входа в проект он предлагает следующее:

Вы хотите войти в подпроект test_subprj.pj? [YnYN] (п)

В этот момент мне нужно ответить либо y, либо n, в зависимости от того, нужен ли мне этот подпроект. Опять же, ответ на этот вопрос зависит от подпроекта. Мне нужно быть в состоянии прочитать подпроект в этом приглашении, чтобы ответить на него с 'y' или 'n'

В настоящее время мне нужно вручную войти в проект и каждый из y 'с и н 'с соответственно. Моя цель - автоматизировать этот процесс с помощью Python.

Есть ли способ автоматически отвечать на эти запросы командной строки?

Текущий прогрессСтратегия подпроцесса
 project_path = "c:/test.pj"

 with Popen(["si", "viewproject", "--project=" + project_path], 
             stdin=PIPE, stdout=PIPE, universal_newlines=True) as p:
     for line in p.stdout: 
         if line.startswith("Do you want"):
             answer = 'n'
         else:
             continue # skip it
         print(answer, file=p.stdin) # provide answer
         p.stdin.flush()

Этот метод висит после оператора with Popen. Он никогда не ошибается, но никогда не входит и не выходит из оператора for и никогда не завершается. В настоящее время я по умолчанию все ответы на "п", но это будет заменено логикой позже.

Стратегия Winpexpect
 import re
 import sys
 from functools import partial
 import winpexpect

 project_path = "c:/test.pj"

 p = winpexpect.winspawn('si viewproject --project=' + project_path)
 p.logfile = sys.stdout
 patterns = [re.compile('ynYN'), winpexpect.EOF]

 for found in iter(partial(p.expect, patterns), 1): # until EOF
     if found == 0:
         answer = 'n'
         p.sendline(answer)

Возвращает следующее сообщение об ошибке:

 Traceback (most recent call last):
   File "C:\Python33\lib\site-packages\winpexpect-1.5-py3.3.egg\winpexpect.py", line 541, in read_nonblocking
     handle, status, data = self.child_output.get(timeout=timeout)
   File "C:\Python33\lib\queue.py", line 175, in get
     raise Empty
 queue.Empty

 During handling of the above exception, another exception occurred:

 Traceback (most recent call last):
   File "C:\Python33\lib\site-packages\winpexpect-1.5-py3.3.egg\pexpect.py", line 1378, in expect_loop
     c = self.read_nonblocking (self.maxread, timeout)
   File "C:\Python33\lib\site-packages\winpexpect-1.5-py3.3.egg\winpexpect.py", line 543, in read_nonblocking
     raise TIMEOUT('Timeout exceeded in read_nonblocking().')
 pexpect.TIMEOUT: Timeout exceeded in read_nonblocking().

 During handling of the above exception, another exception occurred:

 Traceback (most recent call last):
   File "K:\eclipse_3.6.0\plugins\org.python.pydev_2.6.0.2012062818\pysrc\pydev_runfiles.py", line 432, in __get_module_from_str
     mod = __import__(modname)
   File "C:\workspace\Test_prj\Test_prj.py", line 19, in 
     for found in iter(partial(p.expect, patterns), 1): # until EOF
   File "C:\Python33\lib\site-packages\winpexpect-1.5-py3.3.egg\pexpect.py", line 1311, in expect
     return self.expect_list(compiled_pattern_list, timeout, searchwindowsize)
   File "C:\Python33\lib\site-packages\winpexpect-1.5-py3.3.egg\pexpect.py", line 1325, in expect_list
     return self.expect_loop(searcher_re(pattern_list), timeout, searchwindowsize)
   File "C:\Python33\lib\site-packages\winpexpect-1.5-py3.3.egg\pexpect.py", line 1409, in expect_loop
     raise TIMEOUT (str(e) + '\n' + str(self))
 pexpect.TIMEOUT: Timeout exceeded in read_nonblocking().
 
 version: 2.3 ($Revision: 399 $)
 command: si
 args: ['si', 'viewproject', '--project=c:/test.pj']
 searcher: searcher_re:
     0: re.compile("ynYN")
     1: EOF
 buffer (last 100 chars): 
 before (last 100 chars): 
 after: 
 match: None
 match_index: None
 exitstatus: None
 flag_eof: False
 pid: 6448
 child_fd: 4
 closed: False
 timeout: 30
 delimiter: 
 logfile: 
 logfile_read: None
 logfile_send: None
 maxread: 2000
 ignorecase: False
 searchwindowsize: None
 delaybeforesend: 0.05
 delayafterclose: 0.1
 delayafterterminate: 0.1
 ERROR: Module: Test_prj could not be imported (file: C:\workspace\Test_prj\Test_prj.py).
Установка Winpexpect

Путь Ленивых Людей

Установить Распространить

Сделай это

Установите PyWin32

Установить Winpexpect

Дополнительно: установить нос

Необязательно: Установите Pip

Первая мировая проблема

Python - новый язык для меня, и я никогда раньше не устанавливал пакет для Python. Кроме того, Python 3.x немного отличается от других версий Python, что делает установку модулей немного больше приключением.

Таким образом, чтобы помочь другим получить немного сладкого действия модуля (и помочь тем, кто более осведомлен, увидеть, если я сделал что-то не так) здесь »Скоро будет история успеха (надеюсь), документирующая, как я получил и установил свой первый модуль.

Настроить

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

Для Python 3.x этот стандарт распространения модулей называется Distutils.

Вот как разработчик использует Distutils:Распространение модулей Python

А вот как конечный пользователь использует Distutils:Установка модулей Python

Как правило, переход к папке вашего загруженного модуля в командной строке и запуск "setup.py install " будет достаточно.

НО

Иногда жизнь неЭто так просто, и у вас могут возникнуть проблемы с установкой. На самом деле, вам может понадобиться что-то еще. Например, вы можете получить следующую ошибку:

ImportError «Нет модуля с именем Setuptools »»

К счастью, для этого есть решение:Python 3: ImportError "Нет модуля с именем Setuptools "

Оказывается, не все используют distutils. Некоторые пакеты используют setuptools. К сожалению, нет никаких setuptools для Python 3.x. Скорее Python 3.x использует дистрибутив, который является веткой setuptools.

Так что для тех, кто использует Python 3.x, есть Distribute:распространять

Для тех, кто использует Python 2.x, вот Setuptools:Setuptools

В «Инструкции по установке для распространения» говорится следующее: «Скачатьdistribute_setup.py _ и выполните его, используя выбранный вами интерпретатор Python. "

Там также сказано:Обратите внимание, что этот файл также предоставляется в исходной версии. "

Поэтому я скачал Distribute и сохранил его на компьютере. После сохранения на компьютере я запустил дистрибутив_setup.py из исходного выпуска и получил следующую ошибку:

Downloading http://pypi.python.org/packages/source/d/distribute/distribute-0.6.36.tar.gz
Traceback (most recent call last):
  File "C:\Python33\lib\urllib\request.py", line 1252, in do_open
    h.request(req.get_method(), req.selector, req.data, headers)       File "C:\Python33\lib\http\client.py", line 1049, in request
    self._send_request(method, url, body, headers)
  File "C:\Python33\lib\http\client.py", line 1087, in _send_request
    self.endheaders(body)
  File "C:\Python33\lib\http\client.py", line 1045, in endheaders
    self._send_output(message_body)
  File "C:\Python33\lib\http\client.py", line 890, in _send_output
    self.send(msg)
  File "C:\Python33\lib\http\client.py", line 828, in send
    self.connect()
  File "C:\Python33\lib\http\client.py", line 806, in connect
    self.timeout, self.source_address)
  File "C:\Python33\lib\socket.py", line 406, in create_connection
    for res in getaddrinfo(host, port, 0, SOCK_STREAM):
socket.gaierror: [Errno 11001] getaddrinfo failed

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "C:\workspace\PythonTest\distribute_setup.py", line 553, in 
    sys.exit(main())
  File "C:\workspace\PythonTest\distribute_setup.py", line 549, in main
    tarball = download_setuptools(download_base=options.download_base)
  File "C:\workspace\PythonTest\distribute_setup.py", line 204, in download_setuptools
    src = urlopen(url)
  File "C:\Python33\lib\urllib\request.py", line 160, in urlopen
    return opener.open(url, data, timeout)
  File "C:\Python33\lib\urllib\request.py", line 473, in open
    response = self._open(req, data)
  File "C:\Python33\lib\urllib\request.py", line 491, in _open
    '_open', req)
  File "C:\Python33\lib\urllib\request.py", line 451, in _call_chain
    result = func(*args)
  File "C:\Python33\lib\urllib\request.py", line 1272, in http_open
    return self.do_open(http.client.HTTPConnection, req)
  File "C:\Python33\lib\urllib\request.py", line 1255, in do_open
    raise URLError(err)
urllib.error.URLError: 

Ну, это не хорошо! Честно говоря, я до сих пор не знаю, откуда эта ошибка или почему она произошла.

В любом случае, я нашел следующий сайт, на котором был установлен .exe для установки дистрибутива, а также pip.

Установить Распространить

Установить пип

Поэтому я установил их, а затем использовал следующий сайт, чтобы настроить свой компьютер для более удобного использования easy_install:Настройка Easy Install Made Easy

Как только я получил это, я установил нос:Нос

Причина, по которой я получил нос, заключалась в том, чтоВеб-сайт Winpexpect говорит:WinPexpect включает в себя юнит-тесты. Чтобы запустить тесты, вам нужен нос. Используйте следующую команду для запуска тестов:

$ python setup.py test "

Ну, это звучит хорошо :). Теперь мне просто хотелось знать, где проводить этот тест. Я знаю, что если вы устанавливаете вручную, вы используете команду setup.py install, так что наиболее вероятно, что он будет находиться в zip-каталоге онлайн. Чтобы убедиться, что это правильно, я скачал и сохранил файл winpexpect, извлек информацию, перешел к нему через командную строку и запустил тест setup.py.

Здесь был следующий результат:

running test
running build_py
running egg_info
creating c:\documents and settings\slz1fh\desktop\winpexpect\geertj-winpexpect-76df3cfcb143\build\lib\winpexpect.egg-info
writing c:\documents and settings\slz1fh\desktop\winpexpect\geertj-winpexpect-76df3cfcb143\build\lib\winpexpect.egg-info\PKG-INFO
writing dependency_links to c:\documents and settings\slz1fh\desktop\winpexpect\geertj-winpexpect-76df3cfcb143\build\lib\winpexpect.egg-info\dependency_links.txt
writing top-level names to c:\documents and settings\slz1fh\desktop\winpexpect\geertj-winpexpect-76df3cfcb143\build\lib\winpexpect.egg-info\top_level.txt
writing requirements to c:\documents and settings\slz1fh\desktop\winpexpect\geertj-winpexpect-76df3cfcb143\build\lib\winpexpect.egg-info\requires.txt
writing manifest file 'c:\documents and settings\slz1fh\desktop\winpexpect\geertj-winpexpect-76df3cfcb143\build\lib\winpexpect.egg-info\SOURCES.txt'
reading manifest file 'c:\documents and settings\slz1fh\desktop\winpexpect\geertj-winpexpect-76df3cfcb143\build\lib\winpexpect.egg-info\SOURCES.txt'
writing manifest file 'c:\documents and settings\slz1fh\desktop\winpexpect\geertj-winpexpect-76df3cfcb143\build\lib\winpexpect.egg-info\SOURCES.txt'
running build_ext
Traceback (most recent call last):
  File "C:\Documents and Settings\SLZ1FH\Desktop\winpexpect\geertj-winpexpect-76df3cfcb143\setup.py", line 35, in 
    use_2to3 = True
  File "C:\Python33\lib\distutils\core.py", line 148, in setup
    dist.run_commands()
  File "C:\Python33\lib\distutils\dist.py", line 917, in run_commands
    self.run_command(cmd)
  File "C:\Python33\lib\distutils\dist.py", line 936, in run_command
    cmd_obj.run()
  File "C:\Python33\lib\site-packages\distribute-0.6.36-py3.3.egg\setuptools\command\test.py", line 138, in run
    self.with_project_on_sys_path(self.run_tests)
  File "C:\Python33\lib\site-packages\distribute-0.6.36-py3.3.egg\setuptools\command\test.py", line 118, in with_project_on_sys_path
    func()
  File "C:\Python33\lib\site-packages\distribute-0.6.36-py3.3.egg\setuptools\command\test.py", line 164, in run_tests
    testLoader = cks
  File "C:\Python33\lib\unittest\main.py", line 124, in __init__
    self.parseArgs(argv)
  File "C:\Python33\lib\unittest\main.py", line 168, in parseArgs
    self.createTests()
  File "C:\Python33\lib\unittest\main.py", line 175, in createTests
    self.module)
  File "C:\Python33\lib\unittest\loader.py", line 137, in loadTestsFromNames
    suites = [self.loadTestsFromName(name, module) for name in names]
  File "C:\Python33\lib\unittest\loader.py", line 137, in 
    suites = [self.loadTestsFromName(name, module) for name in names]
  File "C:\Python33\lib\unittest\loader.py", line 96, in loadTestsFromName
    module = __import__('.'.join(parts_copy))
  File "C:\Python33\lib\site-packages\nose-1.3.0-py3.3.egg\nose\__init__.py", line 1, in 
    from nose.core import collector, main, run, run_exit, runmodule
  File "C:\Python33\lib\site-packages\nose-1.3.0-py3.3.egg\nose\core.py", line 143
    print "%s version %s" % (os.path.basename(sys.argv[0]), __version__)
                    ^
SyntaxError: invalid syntax

Итак, версия Nose для Python 3.3 содержит недопустимый синтаксис для Python 3.3?

Распечатать "% s версия% s " % (os.path.basename (sys.argv [0]),версия) ...

должно определенно иметь круглые скобки ... Это заставляет меня задаться вопросом, будет ли здесь работать нос, как это явно делается для более ранних версий Python.

Ответы на вопрос(2)

Ваш ответ на вопрос