باستخدام Subprocess.popen في Python مع ملف OS.TMP أثناء تمرير معلمات اختيارية

StackOverflow https://stackoverflow.com/questions/3896795

  •  29-09-2019
  •  | 
  •  

سؤال

أنا أكتب برنامج Python في Linux وفي جزء منه يعمل على تشغيل PDFtOtext قابل للتنفيذ لتحويل نص PDF. يرد الرمز الذي أستخدمه حاليًا أدناه.

pdfData = currentPDF.read()

tf = os.tmpfile()
tf.write(pdfData)
tf.seek(0)

out, err = subprocess.Popen(["pdftotext", "-", "-"], stdin = tf, stdout=subprocess.PIPE ).communicate()

يعمل هذا بشكل جيد ، لكنني الآن أريد تشغيل PDFTOText قابل للتنفيذ مع خيار -layout (يحافظ على تخطيط المستند). حاولت استبدال " -" بالتخطيط ، واستبدال "pdftotext" بـ "pdftotext -layout" إلخ. انهم جميعا يعطيني نص فارغ. نظرًا لأن الإدخال يتم إنشاؤه عبر ملف Temp ، فإنني أواجه مشكلة في اكتشاف قائمة الوسيطة. تفترض معظم الوثائق على Popen أن جميع المعلمات يتم تمريرها من خلال قائمة الوسيطة ، ولكن في حالتي يتم تمرير الإدخال من خلال ملف temp.

أي مساعدة سيكون موضع تقدير كبير.

هل كانت مفيدة؟

المحلول

هذا يعمل بالنسبة لي:

out, err = subprocess.Popen(
    ["pdftotext", '-layout', "-", "-"], stdin = tf, stdout=subprocess.PIPE ).communicate()

على الرغم من أنني لم أتمكن من العثور على تأكيد واضح في صفحة الرجل ، أعتقد أن الأول - يروي pdftotext يتوقع PDF-file ليأتي من stdin ، والثاني - يروي pdftotext يتوقع text-file ليتم إرسالها إلى stdout.

نصائح أخرى

يمكنك تمرير الأمر الكامل في String with Shell = True:

out, err = subprocess.Popen('pdftotext -layout - -', shell=True, stdin=tf, stdout=subprocess.PIPE).communicate()
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top