2012-03-02 15 views
9

Próbuję wykonać następujące czynności, a ich błąd kończy się błędem. Próbowałem uruchomić go z powłoki Python/ze skryptu/na konsoli Windows przez wywołanie Pythona na konsoli. Nic nie działa. Zawsze ten sam błąd.Problemy z korzystaniem z podprocesu.call() w Pythonie 2.7.2 na Windowsie

from subprocess import call 
>>>pat = "d:\info2.txt" 

>>> call(["type",pat]) 

>>>Traceback (most recent call last): 
    File "<pyshell#56>", line 1, in <module> 
    call(["type",pat]) 
    File "C:\Python27\lib\subprocess.py", line 493, in call 
    return Popen(*popenargs, **kwargs).wait() 
    File "C:\Python27\lib\subprocess.py", line 679, in __init__ 
    errread, errwrite) 
    File "C:\Python27\lib\subprocess.py", line 893, in _execute_child 
    startupinfo) 
WindowsError: [Error 2] The system cannot find the file specified 

czy ktoś wie, co jest tutaj nie tak. !! ???

nawet prosty call(["date"]] bez żadnych argumentów również nie powiedzie się z tym samym błędem.

Używam: Python 2.72 Wersja 32-bitowa na komputerze z systemem Windows 7.

+1

co to jest "połączenie" w twoim przykładzie? proszę podać swój import? Zakładając, że masz na myśli funkcję z pakietu 'subprocess', nie mogę odtworzyć twojego błędu, ponieważ' call (["data"]) 'działa doskonale na moim systemie. Jaka jest twoja wersja Pythona, os i inne podobne rzeczy? –

+1

Oto szczegóły, o które prosiłeś: Tak, połączenie jest funkcją w podprocesie. Dokonałem niezbędnych zmian powyżej. mam nadzieję, że teraz sytuacja jest jasna. – Vinayaka

+0

@David Zwicker: Polecenie DOS 'date' istnieje w systemie Windows, wyświetla lub ustawia datę. – BioGeek

Odpowiedz

17

Dodaj shell=True do call:

>>> import subprocess 
>>> subprocess.call('dir', shell=True) 
0 

Jak widzisz, podaje jako wartość kod powrotu, a nie dane wyjściowe z dir. Czeka również, aż komenda się zakończy, więc oczekiwanie na wprowadzenie nowej daty będzie trwało dłużej niż oczekiwanie.

edycja: edycja: jeśli chcesz uchwycić wyjście, użyj subprocess.check_output. Komenda DOS type na przykład drukuje zawartość pliku. Więc załóżmy, że plik info2.txt zawiera nazwę użytkownika, zrobiłbyś:

>>> import subprocess 
>>> path = r'd:\info2.txt' 
>>> output = subprocess.check_output(['type', path], shell=True) 
>>> print output 
Vinu 

Na wszystkie sposoby, aby zadzwonić zewnętrznych poleceń w Pythonie, zobacz ten comprehensive overview to a related question, dowiedzieć się więcej o subprocess konkretnie zobaczyć this article by Doug Hellmann.

+0

Dziękuję @BioGeek, który był pomocny. Pomaga mi rozwiązać problem błędu, ale nie pomaga mi w głównej sprawie. Wszystko, co chciałem zrobić, to ** napisać plik na konsolę cmd **. – Vinayaka

+0

Co rozumiesz przez _type plik na konsolę cmd? Jeśli chcesz użyć polecenia DOS 'type' do przechwycenia zawartości pliku, zobacz moją edycję. Jeśli chcesz czegoś innego, wyjaśnij. – BioGeek

+0

NIE, mam teraz rozwiązanie. Dziękuję za pomoc @BioGeek – Vinayaka

1
pat = "d:\info2.txt" 

W Pythonie i większości innych języków programowania, \ jest znakiem ucieczki, która nie jest zawarta w ciąg chyba dwukrotnie. Albo użyć surowego ciąg lub uciec znak ucieczki:

pat = "d:\\info2.txt" 
+0

Dziękuję za odpowiedź, też tego próbowałem. To też nie działa.Chciałbym zwrócić uwagę na: ** call (["date"]) ** również nie działa z tym samym błędem. – Vinayaka

0

uciec \ z \\:

pat = "d:\\info2.txt" 

lub użyj "raw" ciągi:

pat = r"d:\info2.txt" 
+0

Dziękuję za odpowiedź, też tego próbowałem. To też nie działa. Chciałbym zwrócić uwagę na: ** call (["date"]) ** również zawiedzie z tym samym błędem – Vinayaka

3

Polecenie "typ" nie działa, ponieważ jest to wewnętrzne polecenie - wewnętrzne dla interpretera poleceń/powłoki o nazwie CMD.EXE. Zamiast tego musisz wywołać "nazwa pliku cmd.exe". Dokładny kod to:

call(['cmd','/C type abc.txt']) 
Powiązane problemy