أنابيب بايثون على نظام التشغيل Windows:لماذا هذا لا يعمل؟

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

  •  19-08-2019
  •  | 
  •  

سؤال

أحاول شيئا من هذا القبيل

Output.py

print "Hello"

Input.py

greeting = raw_input("Give me the greeting. ")
print "The greeting is:", greeting

على سطر كمد

Output.py | Input.py

لكنها ترجع خطأ.هل يمكن لأحد أن يقول لي ما الذي أفعله الخطأ؟

شكرا لمساعدتك.

يحرر
باتريك هارينجتون حل يعمل ولكن لا أعرف لماذا ...

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

المحلول

لقد اختبرت هذا على جهازي الذي يعمل بنظام Windows وهو يعمل إذا قمت بتحديد Python exe:

C:\>C:\Python25\python.exe output.py | C:\Python25\python.exe input.py
Give me the greeting. The greeting is: hello

لكنني أحصل على خطأ EOFError أيضًا في حالة تشغيل الأوامر مباشرة على النحو التالي:

output.py | input.py 

لست متأكدًا تمامًا من سبب ذلك، ما زلت أبحث في هذا الأمر ولكن على الأقل يجب أن يوفر لك هذا حلاً بديلاً في الوقت الحالي.قد يكون له علاقة بالطريقة التي يتم بها استدعاء معالج الملفات لملفات .py.

تحديث:حسنا، مالذي تعرفه.يبدو أن هذا هو في الواقع خطأ في Windows حيث قد لا تعمل إعادة التوجيه stdin/stdout بشكل صحيح عند البدء من اقتران ملف.لذا فإن الحل البديل كما أشرنا أنا وباتريك، فأنت بحاجة إلى تحديد أن "python" سيقوم بتشغيل input.py، وإلا فلن يقوم بإعادة توجيه stdout منoutput.py إلى stdin لـ input.py بشكل صحيح.

مرجع:

http://mail.python.org/pipermail/python-bugs-list/2004-August/024923.html

http://support.microsoft.com/default.aspx?kbid=321788

تحديث 2:

لتغيير هذا السلوك وجعل توجيهات Windows تعمل كما هو متوقع لإعادة توجيه stdin/stdout، يمكنك إضافة هذه القيمة إلى السجل (تم اختبارها على الصندوق الخاص بي والتحقق من أنها تعمل حسب الرغبة).

  1. ابدأ تشغيل محرر التسجيل.
  2. حدد موقع ثم انقر فوق المفتاح التالي في التسجيل:

    HKEY_LOCAL_MACHINE\البرمجيات\مايكروسوفت\ويندوز\CurrentVersion\Policies\Explorer

  3. في قائمة التحرير ، انقر فوق إضافة قيمة ، ثم أضف قيمة التسجيل التالية:

    اسم القيمة: InheritConsoleHandles
    نوع البيانات: REG_DWORD
    الجذر:عدد عشري
    بيانات القيمة:1

  4. قم بإنهاء محرر التسجيل.

نصائح أخرى

وتغييره إلى:

Output.py | python Input.py

والناتج سيكون:

<اقتباس فقرة>   

وأعطني تحية. التحية هي: مرحبا

وهنا هو لماذا تحصل على EOFError (من الوثائق المتعلقة raw_input):

<اقتباس فقرة>   

وظيفة ثم يقرأ خط من   المدخلات، وتحولها إلى سلسلة   (تجريد سطر جديد زائدة)، و   يعود ذلك. عندما EOF للقراءة،   يتم رفع EOFError.

http://docs.python.org/library/functions أتش تي أم أل؟ تسليط الضوء = raw_input # raw_input

وأنت قد تحتاج إلى استخدام على sys.stdin ، أو أنها توفر كائن ملف من التي يمكنك استخدامها للقراءة، readlines الأساليب.

import sys
for greeting_line in sys.stdin.readlines():
    print "The greeting is:", greeting_line.strip()
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top