Werkzeug: リローダー、python -m、およびsys.path

作成日 2013年11月11日  ·  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はstdlibのhtml.entitiesをインポートしようとします
  • これにより、 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

しかし、これはかなりハッキーな回避策です(Python <3.3の場合のみ)。

#531の現在の実装では、この特定の問題は修正されていません。残念ながら、どのように解決できるかわかりません。

全てのコメント12件

Werkzeugが実際に同じ引数でサブプロセスを生成し、Python2では__loader__.fullnameし、存在する場合はPython 3で__loader__.nameを使用しても、害はないと思います。

@untitaker 、どういう意味かわかりません。 __loader__何ですか?

python -m somemoduleが使用されたかどうかをPythonで検出できますか?

現在のモジュール名を取得する方法を説明するStackOverflowの回答に出くわしまし__loader__.fullnameが使用可能であることが示されています。

print(__loader__.fullname)

Pythonファイルが-mなしで実行された場合、 __loader__グローバルは存在せず、インポートされたモジュールにも存在しません。

Python 3では、 -mで実行されたモジュールと他のインポートされたモジュールの両方が__loader__グローバルを持っているように見え、 fullname属性はname 。 ただし、すべてのモジュール内で、 name属性には_current_モジュールの値があります。

したがって、Python 2では、 -mで実行されているかどうかを検出できますが、3では検出できません。

また、検出も非常に制限されているため、 __loader__変数をチェックすることにより、 python -mが使用された場合にのみ、直接実行されたモジュール内で検出できます。 また、この動作はまばらに文書化されているように見えるので、とにかくそれがWerkzeugで必要なものかどうかはわかりません。

私はこのバグに自分で遭遇しました。 -mフラグがsys.argvに存在することを期待していましたが、間違いなくそうではありません。

これに対する何らかの回避策はありますか?

はい、 https://github.com/mitsuhiko/flask/issues/1246に掲載されてい

2015年7月午後03時08分30秒CEST 9日、ウェイン・ウェルナー[email protected]書きました:

私はこのバグに自分で遭遇しました。 -mフラグは
sys.argvに存在しますが、間違いなくそうではありません。

これに対する何らかの回避策はありますか?


このメールに直接返信するか、GitHubで表示してください。
https://github.com/mitsuhiko/werkzeug/issues/461#issuecomment -119955695

K-9Mailを使用してAndroidデバイスから送信されました。 簡潔に申し訳ありません。

同様の問題があり、リローダーがモジュールを非パッケージとして実行するため、相対インポートが失敗します。

$ 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

しかし、これはかなりハッキーな回避策です(Python <3.3の場合のみ)。

#531の現在の実装では、この特定の問題は修正されていません。残念ながら、どのように解決できるかわかりません。

一度ローダーで直そうとしたのですが、かなり出ました
2から3までの異なる動作。

2015年9月10日木曜日01:26:56 PM -0700に、MartijnVermaatは次のように書いています。

同様の問題があり、リローダーがモジュールを非パッケージとして実行するため、相対インポートが失敗します。

$ 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

しかし、これはかなりハッキーな回避策です(Python <3.3の場合のみ)。


このメールに直接返信するか、GitHubで表示してください。
https://github.com/mitsuhiko/werkzeug/issues/461#issuecomment -139369694

悲しいことに、

$ python -m werkzeug.servingweasyprint。 navigator:app --reload --debug

  • http://127.0.0.1:5000 /で実行中(CTRL + Cを押して終了します)
  • 統計で再起動
    トレースバック(最後の最後の呼び出し):
    ファイル "/usr/lib/python2.7/site-packages/werkzeug/serving.py"、45行目
    ._compatからインポートPY2
    ValueError:パッケージ以外で相対インポートを試行しました

このPythonのバグは、Pythonで適切に修正できないため、コンソールスクリプトを提供することをお勧めします。

これに何か変更はありますか? この問題が発生したばかりです...(Python 3.6、weasyprintなし、 python -m werkzeug.serving app:application

私は次のようなことをすることで問題を回避することができました:

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

_編集:ソリューションが:arrow_up:_の

このページは役に立ちましたか?
0 / 5 - 0 評価