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
をインポートしようとしますweasyprint/html.py
誤ってインポートされますここの誰も明らかに悪いことをしていません。 この状況に対処することをどのように提案しますか? …/weasyprint/navigator.py
(主にpython -m
使用されると予想されます)がsys.path
場合、その親ディレクトリを
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
このPythonのバグは、Pythonで適切に修正できないため、コンソールスクリプトを提供することをお勧めします。
これに何か変更はありますか? この問題が発生したばかりです...(Python 3.6、weasyprintなし、 python -m werkzeug.serving app:application
)
私は次のようなことをすることで問題を回避することができました:
PYTHONPATH=$PWD:$PYTHONPATH python -m myapp.entrypoints.website
_編集:ソリューションが:arrow_up:_の
最も参考になるコメント
同様の問題があり、リローダーがモジュールを非パッケージとして実行するため、相対インポートが失敗します。
@untitakerからのコメントを使用して、Python <3.3では、
python -m
が使用されたかどうかを検出し(その場合にのみ__loader__
定義されます)、sys.argv
リセットすることでリローダーにもそれを使用させることができます。しかし、これはかなりハッキーな回避策です(Python <3.3の場合のみ)。
#531の現在の実装では、この特定の問題は修正されていません。残念ながら、どのように解決できるかわかりません。