2011-02-02 31 views
6

Estoy codificando un script de Python que está usando la aplicación pdftk varias veces para realizar algunas operaciones.Python: no se puede abrir un archivo usando os.system()

Por ejemplo, puedo usar pdftk en el shell de línea de comandos de Windows para combinar dos archivos PDF de esta manera:

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

me gustaría llevar a cabo la operación anterior en medio de mi script Python. Así es como traté de hacerlo:

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

El comando pdftk anterior funciona perfectamente en el shell de Windows. Sin embargo, falla al abrir los archivos de entrada (1.pdf y 2.pdf) cuando intento ejecutarlo usando Python's os.system(). Aquí está el mensaje de error que recibo de pdftk al intentar ejecutar el comando utilizando Python os.system():

Error: Failed to open PDF file: 1.pdf

Error: Failed to open PDF file: 2.pdf

¿Por qué sucede? ¿Cómo puedo arreglarlo?

Tenga en cuenta: Sé que hay mejores formas de combinar archivos PDF con Python. Mi pregunta no es sobre la fusión de archivos pdf. Eso fue solo un ejemplo de juguete. Lo que intento lograr es la capacidad de ejecutar pdftk y otras aplicaciones de línea de comando usando Python.

+4

Es casi seguro que es un problema con las rutas de directorio. Puede pasar la ruta completa de 'C: \' o donde sea, o asegurarse de que está comenzando en el directorio correcto. – chmullig

+0

También puede ser un problema de interpolación de variables de shell o de cotización. Siempre use el módulo 'subprocess' en lugar de' os.system' para evitar tales problemas. – Philipp

+3

@chmullig: ¿De verdad crees que soy tan estúpido? Bueno, resulta que soy. El problema fue de hecho un problema de ruta. Por favor repita lo que dijo en una respuesta a la pregunta y lo aceptaré. Gracias. – snakile

Respuesta

3

Puede evitar problemas (potenciales) con citar, escapar, y así sucesivamente, con subprocess:

import subprocess 

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

Es tan fácil de usar como os.system, y aún más fácil si está compilando la lista de argumentos dinámicamente.

2

Debe configurar el directorio de trabajo actual del proceso. Si los archivos .pdf se encuentran en /some/path/to/pdf/files/:

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