باستخدام Twill من Python لفتح رابط: "الوحدة النمطية" ليس له سمة "popen" "ما هذا؟

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

سؤال

لقد قمت بتنزيل وتثبيت بيثون 2.5.4 على جهاز الكمبيوتر الخاص بي (نظام التشغيل الخاص بي ويندوز إكس بي) ، تم تنزيله "مجموعة تطوير برامج محرك تطبيقات Goggle" وأنشأت طلبي الأول في بيثون ، والذي كان دليلًا اسمه مرحبا بالعالم الذي يحتوي على ملف Python صغير مع نفس الاسم (Helloworld.py). فيما يلي محتويات هذا الملف الصغير:


print 'Content-Type: text/plain'
print ''
print 'Hello, world!' 

كلما قمت بتشغيل هذا التطبيق محليًا على جهاز الكمبيوتر الخاص بي مع "مجموعة تطوير برامج محرك تطبيقات Goggle", ، أظهر لي متصفحي (Firefox) دائمًا نافذة بيضاء مرحبا بالعالم! مكتوب فيه.

ثم قمت بتنزيل نسيج قطني طويل وفكه في مرحبا بالعالم الدليل. بعد تثبيت Twill بشكل صحيح, ، تمكنت من تنفيذ بعض الأوامر الصغيرة من Twill Shell. على سبيل المثال ، يمكنني اللجوء إلى صفحة ويب بواسطة بعض الرابط:

alt text

ثم أردت أن أؤدي نفس العملية مباشرة من Python (أي عن طريق استخدام Twill من Python.) إليك ما صفحة الوثائق الشديدة تقول عنها:


API Python API Twill

باستخدام Twillbrowser صنع ملحقات

Twill هو في الأساس قذيفة رقيقة حول الحزمة الميكانيكية. يتم تنفيذ جميع أوامر TWILL في ملف الأوامر ، و pyparsing يقوم بعمل تحليل الإدخال وتحويله إلى أوامر Python (انظر parse.py). يتم تنفيذ عمل SHELL التفاعلي ودعم القراءة عبر وحدة CMD (من مكتبة Python القياسية).

باستخدام Twill من Python

هناك طريقتان بسيطتان إلى حد ما لاستخدام تليك من بيثون. (فهي متوافقة مع بعضها البعض ، لذلك لا تحتاج إلى الاختيار بينهما ؛ فقط استخدم أيهما مناسب.)

الأول هو ببساطة استيراد جميع الأوامر في الأوامر. قم باستخدامها مباشرة من Python. علي سبيل المثال،

from twill.commands import *
go("http://www.python.org/")
showforms()

هذا له ميزة كونه بسيطًا للغاية ، بالإضافة إلى ربطه مباشرة بالمجموعة الموثقة من الأوامر في مرجع الأوامر.


لذلك قررت استخدام بهذه الطريقة. لقد حذفت المحتويات السابقة Helloworld.py وأعطاها المحتويات الجديدة:


from twill.commands import *
go("http://www.python.org/")
showforms()

ولكن عندما حاولت تشغيل هذا الملف على جهاز الكمبيوتر الخاص بي مع "مجموعة تطوير برامج محرك تطبيقات Goggle", ، متصفحي ، بدلاً من تصوير محتويات موقع الويب www.python.org ، يعطيني رسالة خطأ: كائن "الوحدة النمطية" ليس له سمة "popen" :

alt text

من فضلك ، ألق نظرة على الصفحة بأكملها هنا.

فيما يلي الأسطر الثلاثة الأخيرة من تلك الصفحة:


: كائن "الوحدة النمطية" ليس له سمة "popen"

  args = ("'module' object has no attribute 'Popen'",)

  message = "'module' object has no attribute 'Popen'" 

هل يمكن لأي شخص ، من فضلك ، أن يشرح لي ما هي هذه السمة البوبن وماذا أفعل خطأ هنا؟

شكرا لكم جميعا مقدما.


تحديث 1

(هذا التحديث هو ردي على الإجابة الثانية المنصوص عليها أدناه ليولوك)

مرحبا ليولوك !!!

حاولت القيام بذلك بهذه الطريقة:

config use_tidy 0
from twill.commands import *
go("http://www.python.org/")

لكنها لم تنجح. تلقيت رسالة الخطأ هذه:

<type 'exceptions.SyntaxError'>: invalid syntax (helloworld.py, line 1)
      args = ('invalid syntax', (r'E:\helloworld\helloworld.py', 1, 15, 'config use_tidy 0\n'))
      filename = r'E:\helloworld\helloworld.py'
      lineno = 1
      message = ''
      msg = 'invalid syntax'
      offset = 15
      print_file_and_line = None
      text = 'config use_tidy 0\n'

(يمكنك رؤية الصفحة بأكملها هنا)

هل لديك أي فكرة عما يعنيه وما الخطأ الذي حدث؟

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

المحلول

يقوم برنامج TIDY بعمل رائع في إنتاج HTML الصحيح من صفحات الويب المشوهة والمطلية بالمواقع. بشكل افتراضي ، سيقوم Twill بتشغيل الصفحات عبر TIDY قبل معالجتها. هذا بشكل افتراضي لأن مكتبات Python التي تعتبر HTML سيئة للغاية في التعامل مع HTML غير الصحيحة ، وغالبًا ما تعيد نتائج غير صحيحة على صفحات الويب "Real World".

لتعطيل هذه الميزة ، قم بتعيين config do_run_tidy 0.

نصائح أخرى

لا يمكنك استخدام أي شيء في محرك تطبيق Google. يستخدم Twill أشياء غير متوفرة على محرك تطبيق Google للعمل. لذلك لا يتم دعم Twill بالكامل بواسطة App Engine.

والجدير بالذكر أن الكود يحاول استدعاء أمر خارجي ، tidy, ، والاتصال بالأوامر الخارجية في محرك التطبيق لا يعمل.

أعتقد أنك يجب أن تستخدم mechanize مباشرة. يتواصل Twill مع النظام بطريقة غير مدعومة بواسطة Google App Engine.

import mechanize

browser = mechanize.Browser()

browser.open('http://www.python.org')

for f in browser.forms():
    print f # you'll have to extend it
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top