Werkzeug: معاد تحميل ، python -m ، و sys.path

تم إنشاؤها على ١١ نوفمبر ٢٠١٣  ·  12تعليقات  ·  مصدر: pallets/werkzeug

راجع https://github.com/Kozea/WeasyPrint/issues/133

ما يحدث هو:

  • يتم تشغيل python -m weasyprint.navigator
  • [sys.executable] + sys.argv هو ['…/python', '…/weasyprint/navigator.py']
  • تقوم أداة إعادة التحميل بإنتاج عملية فرعية بهذه الطريقة
  • العملية الفرعية لا تحتوي على -m ، لذلك أضاف Python الدليل الرئيسي لملف .py إلى sys.path
  • يحاول Werkzeug استيراد html.entities الخاص بـ stdlib
  • هذا يستورد بشكل غير صحيح weasyprint/html.py
  • فواصل الاشياء

لا أحد هنا يفعل أي شيء خاطئ بشكل واضح. كيف تقترح التعامل مع هذا الموقف؟ ما رأيك في إزالة …/weasyprint/navigator.py (والذي من المتوقع أن يتم استخدامه في الغالب مع python -m ) لإزالة دليله الأصلي من sys.path إذا كان موجودًا؟

bug reloader

التعليق الأكثر فائدة

لدي مشكلة مماثلة ، حيث تفشل عمليات الاستيراد النسبية لأن أداة إعادة التحميل تنفذ الوحدة على أنها ليست حزمة:

$ python -m myapp.entrypoints.website
 * Running on http://127.0.0.1:5000 (Press CTRL+C to quit)
 * Restarting with stat
Traceback (most recent call last):
  File "/tmp/myapp/entrypoints/website.py", line 9, in <module>
    from . import mymodule
ValueError: Attempted relative import in non-package

باستخدام التعليقات من untitaker ، في Python <3.3 ، يمكننا اكتشاف ما إذا كان قد تم استخدام python -m (عندها فقط يتم تعريف __loader__ ) وإجبار أداة إعادة التحميل على استخدامها أيضًا عن طريق إعادة تعيين sys.argv :

try:
    sys.argv = ['-m', __loader__.fullname] + sys.argv[1:]
except NameError:
    pass

لكن هذا حل بديل تمامًا (وفقط لبيثون <3.3).

التنفيذ الحالي في # 531 لا يصلح هذه المشكلة بالذات وللأسف لا أرى بأي طريقة كيف يمكن ذلك.

ال 12 كومينتر

لا أعتقد أنه لن يضر إذا قام Werkzeug بإنتاج العملية الفرعية بنفس الوسيطات ، باستخدام __loader__.fullname في Python 2 و __loader__.name في Python 3 إن وجدت.

untitaker ، لا أفهم ما تعنيه. ما هو __loader__ ؟

هل يمكننا الكشف في Python إذا تم استخدام python -m somemodule أم لا؟

تعرفت على إجابة StackOverflow التي أوضحت كيفية الحصول على اسم الوحدة الحالية. يُظهر اختبار بسيط أنه في Python 2 ، يتوفر __loader__.fullname :

print(__loader__.fullname)

لا يوجد __loader__ global إذا تم تنفيذ ملف Python بدون -m ، كما أنه غير موجود في الوحدات النمطية المستوردة.

في Python 3 ، يبدو أن كل من الوحدة النمطية التي تم تنفيذها باستخدام -m وأي وحدات أخرى مستوردة تحتوي على __loader__ عالميًا ، والسمة fullname أصبحت الآن name . ولكن داخل كل وحدة نمطية ، تحتوي السمة name على قيمة الوحدة النمطية _current_.

لذلك ، في Python 2 ، يمكننا أن نكتشف ما إذا كنا نعمل بـ -m ، لكن ليس في 3.

كما أن الاكتشاف محدود للغاية أيضًا ، لذلك يمكنك فقط الكشف داخل الوحدة النمطية المنفذة مباشرة إذا تم استخدام python -m عن طريق التحقق من المتغير __loader__ . أيضًا ، يبدو هذا السلوك موثقًا بشكل ضئيل ، لذلك لست متأكدًا مما إذا كان هذا هو ما نريده في Werkzeug على أي حال.

لقد صادفت هذا الخطأ بنفسي. كنت أتوقع أن تكون العلامة -m موجودة في sys.argv ، لكنها بالتأكيد ليست كذلك.

هل هناك أي نوع من الحل لهذا؟

نعم ، يتم تقديم واحد في https://github.com/mitsuhiko/flask/issues/1246

في 9 يوليو 2015 الساعة 15:08:30 بتوقيت وسط أوروبا الصيفي ، كتب واين ويرنر [email protected] :

لقد صادفت هذا الخطأ بنفسي. كنت أتوقع أن تكون علامة -m
موجود في sys.argv ، لكنه بالتأكيد ليس كذلك.

هل هناك أي نوع من الحل لهذا؟


قم بالرد على هذا البريد الإلكتروني مباشرة أو قم بعرضه على GitHub:
https://github.com/mitsuhiko/werkzeug/issues/461#issuecomment -119955695

مُرسَل من جهازي الذي يعمل بنظام Android مع K-9 Mail. عذرا على الاختصار.

لدي مشكلة مماثلة ، حيث تفشل عمليات الاستيراد النسبية لأن أداة إعادة التحميل تنفذ الوحدة على أنها ليست حزمة:

$ python -m myapp.entrypoints.website
 * Running on http://127.0.0.1:5000 (Press CTRL+C to quit)
 * Restarting with stat
Traceback (most recent call last):
  File "/tmp/myapp/entrypoints/website.py", line 9, in <module>
    from . import mymodule
ValueError: Attempted relative import in non-package

باستخدام التعليقات من untitaker ، في Python <3.3 ، يمكننا اكتشاف ما إذا كان قد تم استخدام python -m (عندها فقط يتم تعريف __loader__ ) وإجبار أداة إعادة التحميل على استخدامها أيضًا عن طريق إعادة تعيين sys.argv :

try:
    sys.argv = ['-m', __loader__.fullname] + sys.argv[1:]
except NameError:
    pass

لكن هذا حل بديل تمامًا (وفقط لبيثون <3.3).

التنفيذ الحالي في # 531 لا يصلح هذه المشكلة بالذات وللأسف لا أرى بأي طريقة كيف يمكن ذلك.

أعتقد أنني حاولت إصلاح هذا مع اللودر مرة واحدة ، لكنه ظهر بشكل كبير
يختلف السلوك من 2 إلى 3.

في الخميس ، 10 سبتمبر 2015 الساعة 01:26:56 مساءً -0700 مساءً ، كتب مارتين فيرمات:

لدي مشكلة مماثلة ، حيث تفشل عمليات الاستيراد النسبية لأن أداة إعادة التحميل تنفذ الوحدة على أنها ليست حزمة:

$ python -m myapp.entrypoints.website
 * Running on http://127.0.0.1:5000 (Press CTRL+C to quit)
 * Restarting with stat
Traceback (most recent call last):
  File "/tmp/myapp/entrypoints/website.py", line 9, in <module>
    from . import mymodule
ValueError: Attempted relative import in non-package

باستخدام التعليقات من untitaker ، في Python <3.3 ، يمكننا اكتشاف ما إذا كان قد تم استخدام python -m (عندها فقط يتم تعريف __loader__ ) وإجبار أداة إعادة التحميل على استخدامها أيضًا عن طريق إعادة تعيين sys.argv :

try:
    sys.argv = ['-m', __loader__.fullname] + sys.argv[1:]
except NameError:
    pass

لكن هذا حل بديل تمامًا (وفقط لبيثون <3.3).


قم بالرد على هذا البريد الإلكتروني مباشرة أو قم بعرضه على GitHub:
https://github.com/mitsuhiko/werkzeug/issues/461#issuecomment -139369694

للأسف،

$ python -m werkzeug.serving weasyprint. الملاح: التطبيق - إعادة التحميل - التصحيح

  • يعمل على http://127.0.0.1 : 5000 / (اضغط CTRL + C للإنهاء)
  • إعادة التشغيل مع stat
    Traceback (أحدث مكالمة أخيرة):
    ملف "/usr/lib/python2.7/site-packages/werkzeug/serving.py" ، السطر 45 ، في
    من ._compat استيراد PY2
    ValueError: محاولة استيراد نسبي في غير حزمة

لا يمكن إصلاح هذا الخطأ في الثعبان بشكل صحيح باستخدام بيثون ، لذلك أقترح تقديم برنامج نصي لوحدة التحكم

أي تغيير في هذا؟ واجهت هذه المشكلة للتو ... (Python 3.6 ، لا توجد بصمة weasyprint ، فقط python -m werkzeug.serving app:application )

تمكنت من التغلب على المشكلة من خلال القيام بشيء مثل:

PYTHONPATH=$PWD:$PYTHONPATH python -m myapp.entrypoints.website

_Edit: أدركت أن الحل كان أعلى بقليل : arrow_up: _

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات

القضايا ذات الصلة

d42 picture d42  ·  6تعليقات

davidism picture davidism  ·  9تعليقات

asottile picture asottile  ·  11تعليقات

caiz picture caiz  ·  3تعليقات

sorenh picture sorenh  ·  4تعليقات