إعادة توجيه الأمر إلى إدخال آخر في بايثون
سؤال
أود تكرار هذا في بيثون:
gvimdiff <(hg cat file.txt) file.txt
(يقوم hg cat file.txt بإخراج أحدث إصدار من file.txt)
أعرف كيفية توجيه الملف إلى gvimdiff، لكنه لن يقبل ملفًا آخر:
$ hg cat file.txt | gvimdiff file.txt -
Too many edit arguments: "-"
الوصول إلى الجزء بايثون ...
# hgdiff.py
import subprocess
import sys
file = sys.argv[1]
subprocess.call(["gvimdiff", "<(hg cat %s)" % file, file])
عندما يتم استدعاء العملية الفرعية فإنها تمر فقط <(hg cat file)
على gvimdiff
كاسم ملف.
فهل هناك أي طريقة لإعادة توجيه أمر كما يفعل باش؟من أجل البساطة، ما عليك سوى التقاط ملف وإعادة توجيهه إلى الاختلاف:
diff <(cat file.txt) file.txt
المحلول
يمكن إنجازه.اعتبارًا من إصدار Python 2.5، أصبحت هذه الآلية خاصة بنظام التشغيل Linux وليست محمولة:
import subprocess
import sys
file = sys.argv[1]
p1 = subprocess.Popen(['hg', 'cat', file], stdout=subprocess.PIPE)
p2 = subprocess.Popen([
'gvimdiff',
'/proc/self/fd/%s' % p1.stdout.fileno(),
file])
p2.wait()
ومع ذلك، في حالة الاختلاف المحددة، يمكنك ببساطة أخذ أحد الملفات من stdin، وإزالة الحاجة إلى استخدام وظيفة bash-alike المعنية:
file = sys.argv[1]
p1 = subprocess.Popen(['hg', 'cat', file], stdout=subprocess.PIPE)
p2 = subprocess.Popen(['diff', '-', file], stdin=p1.stdout)
diff_text = p2.communicate()[0]
نصائح أخرى
هناك أيضًا وحدة الأوامر:
import commands
status, output = commands.getstatusoutput("gvimdiff <(hg cat file.txt) file.txt")
هناك أيضًا مجموعة من الوظائف المنبثقة، إذا كنت تريد الحصول على البيانات من أمر ما أثناء تشغيله.
وهذا في الواقع مثال في مستندات:
p1 = Popen(["dmesg"], stdout=PIPE)
p2 = Popen(["grep", "hda"], stdin=p1.stdout, stdout=PIPE)
output = p2.communicate()[0]
مما يعني بالنسبة لك:
import subprocess
import sys
file = sys.argv[1]
p1 = Popen(["hg", "cat", file], stdout=PIPE)
p2 = Popen(["gvimdiff", "file.txt"], stdin=p1.stdout, stdout=PIPE)
output = p2.communicate()[0]
يؤدي هذا إلى إزالة استخدام البتات /proc/self/fd الخاصة بنظام Linux، مما يجعلها تعمل على الأرجح على وحدات أخرى مثل Solaris وBSDs (بما في ذلك MacOS) وربما تعمل أيضًا على Windows.
لقد خطر لي أنك ربما تبحث عن إحدى الوظائف المفتوحة.
من: http://docs.python.org/lib/module-popen2.html
POPEN3 (CMD [، bufsize [، mode]]) ينفذ CMD كعملية فرعية.إرجاع كائنات الملف (child_stdout، Child_stdin، Child_stderr).
ناماستي ، مارك