2011-02-02 7 views
6

Sto codificando uno script Python che utilizza l'applicazione pdftk alcune volte per eseguire alcune operazioni.Python: impossibile aprire un file utilizzando os.system()

Per esempio, posso usare pdftk nella shell a riga di comando di Windows per unire due file pdf in questo modo:

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

Vorrei eseguire l'operazione sopra descritta nel bel mezzo del mio script Python. Ecco come ho provato a farlo:

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

Il comando pdftk sopra funziona perfettamente nella shell di Windows. Tuttavia, non riesce ad aprire i file di input (1.pdf e 2.pdf) quando sto cercando di eseguirlo usando Python os.system(). Ecco il messaggio di errore che ricevo da pdftk quando si cerca di eseguire il comando utilizzando Python os.system():

Error: Failed to open PDF file: 1.pdf

Error: Failed to open PDF file: 2.pdf

Perché succede? Come posso ripararlo?

Nota: so che esistono modi migliori per unire file PDF con Python. La mia domanda non riguarda l'unione di file PDF. Quello era solo un esempio di giocattolo. Quello che sto cercando di ottenere è la possibilità di eseguire pdftk e altre applicazioni da riga di comando usando Python.

+4

È quasi certamente un problema con i percorsi di directory. Potresti passare nel percorso completo da "C: \" o dovunque sia, o assicurarti di iniziare nella giusta directory. – chmullig

+0

Può anche essere un problema di interpolazione variabile di quotatura o shell. Usa sempre il modulo 'subprocess' invece di' os.system' per evitare tali problemi. – Philipp

+3

@chmullig: Sei davvero così stupido? Bene, risulta che lo sono. Il problema era davvero un problema di percorso. Per favore ripeti ciò che hai detto in una risposta alla domanda e accetterò. Grazie. – snakile

risposta

3

È possibile evitare di (potenziali) problemi con la citazione, in fuga, e così via, con subprocess:

import subprocess 

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

E 'altrettanto facile da usare come os.system, e ancora più semplice se si sta costruendo la lista degli argomenti dinamicamente.

2

È necessario impostare la directory di lavoro corrente del processo. Se i file .pdf si trovano in /some/path/to/pdf/files/:

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