راجع https://github.com/Kozea/WeasyPrint/issues/133
ما يحدث هو:
python -m weasyprint.navigator
[sys.executable] + sys.argv
هو ['…/python', '…/weasyprint/navigator.py']
-m
، لذلك أضاف Python الدليل الرئيسي لملف .py إلى sys.path
html.entities
الخاص بـ stdlibweasyprint/html.py
لا أحد هنا يفعل أي شيء خاطئ بشكل واضح. كيف تقترح التعامل مع هذا الموقف؟ ما رأيك في إزالة …/weasyprint/navigator.py
(والذي من المتوقع أن يتم استخدامه في الغالب مع python -m
) لإزالة دليله الأصلي من sys.path
إذا كان موجودًا؟
لا أعتقد أنه لن يضر إذا قام 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. الملاح: التطبيق - إعادة التحميل - التصحيح
لا يمكن إصلاح هذا الخطأ في الثعبان بشكل صحيح باستخدام بيثون ، لذلك أقترح تقديم برنامج نصي لوحدة التحكم
أي تغيير في هذا؟ واجهت هذه المشكلة للتو ... (Python 3.6 ، لا توجد بصمة weasyprint ، فقط python -m werkzeug.serving app:application
)
تمكنت من التغلب على المشكلة من خلال القيام بشيء مثل:
PYTHONPATH=$PWD:$PYTHONPATH python -m myapp.entrypoints.website
_Edit: أدركت أن الحل كان أعلى بقليل : arrow_up: _
التعليق الأكثر فائدة
لدي مشكلة مماثلة ، حيث تفشل عمليات الاستيراد النسبية لأن أداة إعادة التحميل تنفذ الوحدة على أنها ليست حزمة:
باستخدام التعليقات من untitaker ، في Python <3.3 ، يمكننا اكتشاف ما إذا كان قد تم استخدام
python -m
(عندها فقط يتم تعريف__loader__
) وإجبار أداة إعادة التحميل على استخدامها أيضًا عن طريق إعادة تعيينsys.argv
:لكن هذا حل بديل تمامًا (وفقط لبيثون <3.3).
التنفيذ الحالي في # 531 لا يصلح هذه المشكلة بالذات وللأسف لا أرى بأي طريقة كيف يمكن ذلك.