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 WinpexpectLazy Persons Way
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.
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.