2011-02-02 35 views
6

Tôi đang mã hóa tập lệnh Python đang sử dụng ứng dụng pdftk một vài lần để thực hiện một số thao tác.Python: Không mở tệp bằng os.system()

Ví dụ, tôi có thể sử dụng pdftk trong vỏ cửa sổ dòng lệnh để hợp nhất hai tập tin pdf như thế này:

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

Tôi muốn thực hiện các hoạt động nêu trên ở giữa kịch bản Python của tôi. Dưới đây là cách tôi đã thử thực hiện:

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

Lệnh pdftk ở trên hoạt động hoàn hảo trong vỏ Windows. Tuy nhiên, nó không mở được các tệp đầu vào (1.pdf và 2.pdf) khi tôi đang cố gắng thực thi nó bằng cách sử dụng của Python os.system(). Đây là thông báo lỗi tôi nhận được từ pdftk khi cố gắng thực thi lệnh bằng cách sử dụng Python os.system():

Error: Failed to open PDF file: 1.pdf

Error: Failed to open PDF file: 2.pdf

Tại sao nó xảy ra? Làm thế nào tôi có thể sửa chữa nó?

Xin lưu ý: Tôi biết có cách tốt hơn để hợp nhất các tệp pdf bằng Python. Câu hỏi của tôi không phải là về việc sáp nhập các tệp pdf. Đó chỉ là một ví dụ đồ chơi. Những gì tôi đang cố gắng đạt được là khả năng thực thi pdftk và các ứng dụng dòng lệnh khác bằng Python.

+4

Nó gần như chắc chắn là một vấn đề với đường dẫn thư mục. Bạn có thể vượt qua trong đường dẫn đầy đủ từ 'C: \' hoặc bất cứ nơi nào nó, hoặc chắc chắn rằng bạn đang bắt đầu trong thư mục bên phải. – chmullig

+0

Nó cũng có thể là một vấn đề nội suy biến hoặc trích dẫn. Luôn sử dụng mô đun 'subprocess' thay vì' os.system' để tránh các vấn đề như vậy. – Philipp

+3

@chmullig: Bạn có thực sự là tôi ngu ngốc không? Vâng, hóa ra tôi. Vấn đề thực sự là một vấn đề đường dẫn. Xin vui lòng lặp lại những gì bạn nói trong một câu trả lời cho câu hỏi và tôi sẽ chấp nhận nó. Cảm ơn. – snakile

Trả lời

3

Bạn có thể tránh các vấn đề (tiềm năng) với trích dẫn, đào thoát, và như vậy, với subprocess:

import subprocess 

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

Nó cũng giống như dễ sử dụng như os.system và thậm chí dễ dàng hơn nếu bạn xây dựng danh sách đối số một cách linh hoạt.

2

Bạn cần đặt thư mục làm việc hiện tại của quy trình. Nếu các tập tin .pdf được đặt tại /some/path/to/pdf/files/:

>>> os.getcwd() 
'/home/vz0' 
>>> os.chdir('/some/path/to/pdf/files/') 
Các vấn đề liên quan