2011-02-02 13 views
6

Koduję skrypt w języku Python, który kilkakrotnie używa aplikacji pdftk do wykonywania niektórych operacji.Python: Nie można otworzyć pliku przy użyciu os.system()

Na przykład, można użyć pdftk w linii powłoki poleceń okna scalić dwa pliki pdf tak:

pdftk 1.pdf 2.pdf cat output result.pdf 

chciałbym wykonać powyższą operację w środku mojego skryptu Pythona. Oto jak próbowałem to zrobić:

os.system('pdftk 1.pdf 2.pdf cat output result.pdf') 

Powyższe polecenie pdftk działa doskonale w powłoce systemu Windows. Jednak nie uda się otworzyć plików wejściowych (1.pdf i 2.pdf), gdy próbuję wykonać to przy pomocy Pythona os.system(). Oto komunikat dostaję od pdftk gdy próbuje wykonać polecenie używając Pythona os.system():

Error: Failed to open PDF file: 1.pdf

Error: Failed to open PDF file: 2.pdf

Dlaczego tak się stało? Jak mogę to naprawić?

Uwaga: wiem, że istnieją lepsze sposoby łączenia plików pdf z Python. Moje pytanie nie dotyczy łączenia plików pdf. To był tylko zabawny przykład. Co staram się osiągnąć to zdolność do uruchamiania pdftk i innych aplikacji linii poleceń za pomocą Pythona.

+4

To prawie na pewno problem ze ścieżkami katalogów. Możesz przekazać pełną ścieżkę z 'C: \' lub gdziekolwiek ona jest, lub upewnij się, że zaczynasz w odpowiednim katalogu. – chmullig

+0

Może to być również problem z interpolacją zmiennej lub powielaniem. Zawsze używaj modułu 'subprocess' zamiast' os.system', aby uniknąć takich problemów. – Philipp

+3

@chmullig: Czy naprawdę jesteś tak głupi? Cóż, okazuje się, że jestem. Problem był rzeczywiście problemem ścieżki. Powtórz to, co powiedziałeś w odpowiedzi na pytanie, a ja to zaakceptuję. Dzięki. – snakile

Odpowiedz

3

Można uniknąć (potencjalnych) problemy z cytowanie, uciekając, i tak dalej, z subprocess:

import subprocess 

subprocess.call(['pdftk', '1.pdf', '2.pdf', 'cat', 'output', 'result.pdf']) 

To tak samo łatwe jak os.system, a jeszcze łatwiejsze, jeśli dynamicznie budujesz listę argumentów.

2

Musisz ustawić bieżący katalog roboczy procesu. Jeśli pliki .pdf znajdują się /some/path/to/pdf/files/:

>>> os.getcwd() 
'/home/vz0' 
>>> os.chdir('/some/path/to/pdf/files/')