أنابيب بايثون على نظام التشغيل Windows:لماذا هذا لا يعمل؟
سؤال
أحاول شيئا من هذا القبيل
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، يمكنك إضافة هذه القيمة إلى السجل (تم اختبارها على الصندوق الخاص بي والتحقق من أنها تعمل حسب الرغبة).
- ابدأ تشغيل محرر التسجيل.
حدد موقع ثم انقر فوق المفتاح التالي في التسجيل:
HKEY_LOCAL_MACHINE\البرمجيات\مايكروسوفت\ويندوز\CurrentVersion\Policies\Explorer
في قائمة التحرير ، انقر فوق إضافة قيمة ، ثم أضف قيمة التسجيل التالية:
اسم القيمة: InheritConsoleHandles
نوع البيانات: REG_DWORD
الجذر:عدد عشري
بيانات القيمة:1قم بإنهاء محرر التسجيل.
نصائح أخرى
وتغييره إلى:
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()