Python: Odpowiadaj na wiersze poleceń

Próbuję użyć Pythona do interakcji z innym programem za pomocą wiersza poleceń. Głównym problemem, jaki mam, jest konkretne wywołanie, które ma wiele monitów uzupełniających. Początkowo wywołanie wiersza poleceń prosi o podanie nazwy projektu, a następnie pyta, czy chciałbym zobaczyć któryś z podfolderów projektu. Muszę odpowiedzieć y / n każdemu z nich w porządku, a odpowiedź na nie jest niestety nie wszystkie y lub n. Ponadto nie mogę znać odpowiedzi na pytanie bez odczytywania poszczególnych monitów, więc nie jestem w stanie wysłać bloku „y” lub „n” jednocześnie.

To jest połączenie z linii poleceń:

si viewproject

Po wprowadzeniu polecenia wiersz polecenia wyświetla monit:

Wprowadź nazwę projektu:

A przykładową odpowiedzią byłoby:

Wprowadź nazwę projektu: c: /test.pj

Po wejściu do projektu wyświetla następujące pytanie:

Czy chcesz ponownie włączyć się do podprojektu test_subprj.pj? [ynYN] (n)

W tym momencie muszę odpowiedzieć albo y, albo n, zależnie od tego, czy potrzebuję tego podprojektu. Ponownie odpowiedź na to pytanie zależy od podprojektu. Muszę być w stanie odczytać podprojekt w tym pytaniu, aby odpowiedzieć na to „y” lub „n”

Obecnie muszę ręcznie wprowadzić projekt i każdy z y i n. Moim celem jest automatyzacja tego procesu za pomocą Pythona.

Czy istnieje sposób automatycznego odpowiadania na te monity wiersza poleceń?

Aktualny postępStrategia podprocesów
 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()

Ta metoda jest zawieszona za stwierdzeniem „Popen”. Nigdy się nie myli, ale nigdy nie wchodzi ani nie wychodzi z instrukcji for i nigdy się nie kończy. Obecnie domyślnie przyjmuję wszystkie odpowiedzi na „n”, ale później zostaną one zastąpione logiką.

Strategia 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)

Zwraca następujący komunikat o błędzie:

 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 <module>
     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().
 <winpexpect.winspawn object at 0x0144AE50>
 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: <class 'pexpect.TIMEOUT'>
 match: None
 match_index: None
 exitstatus: None
 flag_eof: False
 pid: 6448
 child_fd: 4
 closed: False
 timeout: 30
 delimiter: <class 'pexpect.EOF'>
 logfile: <_io.TextIOWrapper name='<stdout>' mode='w' encoding='Cp1252'>
 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).
Instalowanie Winpexpect

Lazy Persons Way

Zainstaluj Dystrybucja

Zrób to

Zainstaluj PyWin32

Zainstaluj Winpexpect

Opcjonalnie: Zainstaluj nos

Opcjonalnie: Zainstaluj Pip

Problemy pierwszego świata

Python jest dla mnie nowym językiem i nigdy wcześniej nie zainstalowałem pakietu dla Pythona. Dodatkowo, Python 3.x jest trochę inny niż inne wersje Pythona, dzięki czemu instalowanie modułów jest trochę bardziej przygodowe.

Aby pomóc innym w uzyskaniu słodkiego modułu (i pomóc tym, którzy mają większą wiedzę, jeśli zrobiłem coś złego), wkrótce przedstawię historię sukcesu (miejmy nadzieję) dokumentującą, jak dostałem i zainstalowałem mój pierwszy moduł.

Ustawiać

Python umożliwia grupom zewnętrznym tworzenie i rozpowszechnianie modułów, które rozszerzają możliwości języka programowania. Oczywiście istnieje standardowy sposób, aby pomóc zewnętrznym programistom w tworzeniu modułów tak łatwo dostępnych dla użytkownika końcowego, jak to możliwe.

Dla Pythona 3.x ten standard dla modułów dystrybucyjnych nazywa się Distutils.

Oto jak deweloper używa Distutils:Dystrybucja modułów Pythona

Oto, w jaki sposób użytkownik końcowy korzysta z Distutils:Instalowanie modułów Pythona

Normalnie wystarczy przejść do folderu pobranego modułu w wierszu poleceń i uruchomić „install.py install”.

ALE

Czasami życie nie jest takie proste i nadal możesz mieć problemy z instalacją. W rzeczywistości możesz potrzebować czegoś innego. Na przykład może pojawić się następujący błąd:

„ImportError„ Brak modułu o nazwie Setuptools ””

Na szczęście istnieje rozwiązanie tego problemu:Python 3: ImportError „Brak modułu o nazwie Setuptools”

Jak się okazuje, nie wszystko używa distutils. Niektóre pakiety używają narzędzi konfiguracyjnych. Niestety, nie ma narzędzi konfiguracyjnych dla Pythona 3.x. Raczej Python 3.x używa dystrybucji, która jest gałęzią narzędzi konfiguracyjnych.

Więc dla tych, którzy używają Pythona 3.x, tutaj jest Dystrybucja:Rozprowadzać

Dla tych, którzy używają Pythona 2.x, oto Setuptools:Narzędzia konfiguracyjne

W instrukcjach instalacji dotyczących dystrybucji znajduje się następujący komunikat: „Pobierzdistribute_setup.py <http://python-distribute.org/distribute_setup.py>_ i uruchom go, używając wybranego interpretera Pythona. "

Mówi też: „Zauważ, że ten plik jest również dostępny w wersji źródłowej”.

Więc pobrałem Distribute i zapisałem go na komputerze. Po zapisaniu na komputerze uruchomiłem distribute_setup.py z wersji źródłowej i otrzymałem następujący błąd:

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 <module>
    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: <urlopen error [Errno 11001] getaddrinfo failed>

Cóż, to nie jest dobre! Szczerze mówiąc, nadal nie wiem, skąd pochodzi błąd lub dlaczego tak się stało.

Niezależnie od tego, znalazłem następującą witrynę, która uruchomiła plik .exe, aby zainstalować dystrybucję i pip.

Zainstaluj Dystrybucja

Zainstaluj Pip

Zainstalowałem je, a następnie użyłem następującej strony, aby skonfigurować komputer do łatwiejszego używania easy_install:Łatwa instalacja dzięki łatwej instalacji

Gdy już to zrobiłem, zainstalowałem nos:Nos

Powodem, dla którego dostałem nos, był faktStrona internetowa Winpexpect mówi: „WinPexpect zawiera testy jednostkowe. Aby uruchomić testy, potrzebujesz nosa. Użyj następujących poleceń, aby uruchomić testy:

$ python setup.py test "

Brzmi ładnie :). Teraz chciałem wiedzieć, gdzie uruchomić ten test. Wiem, że jeśli zainstalujesz ręcznie, użyjesz komendy install.py, więc z pewnością będzie to plik setup.py w skompresowanym katalogu online. Aby sprawdzić, czy było to poprawne, pobrałem i zapisałem plik winpexpect, wyodrębniłem informacje, nawigowałem do niego za pomocą wiersza polecenia i uruchomiłem test setup.py.

Oto następujący wynik:

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 <module>
    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 <listcomp>
    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 <module>
    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

Ok, więc wersja Nosa Pythona 3.3 zawiera nieprawidłową składnię Pythona 3.3?

wydrukuj "% s wersja% s"% (os.path.basename (sys.argv [0]),wersja) ...

powinien zdecydowanie mieć nawias wokół niego ... To sprawia, że ​​zastanawiam się, czy nos rzeczywiście będzie działał tutaj, ponieważ wyraźnie wygląda na to, że zostanie utworzony dla starszych wersji Pythona.

questionAnswers(2)

yourAnswerToTheQuestion