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κ°€ Python 2μ—μ„œ __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μ—μ„œλŠ” μ‹€ν–‰ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

λ˜ν•œ νƒμ§€λŠ” 맀우 μ œν•œμ μ΄λ―€λ‘œ python -m __loader__ λ³€μˆ˜λ₯Ό ν™•μΈν•˜μ—¬ python -m κ°€ μ‚¬μš© 된 경우 직접 μ‹€ν–‰ 된 λͺ¨λ“ˆ λ‚΄λΆ€μ—μ„œλ§Œ 탐지 ν•  수 μžˆμŠ΅λ‹ˆλ‹€. λ˜ν•œ,이 λ™μž‘μ€ 거의 λ¬Έμ„œν™”λ˜μ§€ μ•Šμ€ κ²ƒμ²˜λŸΌ λ³΄μ΄λ―€λ‘œ μ–΄μ¨Œλ“  Werkzeugμ—μ„œ 그것이 μš°λ¦¬κ°€ μ›ν•˜λŠ” 것인지 ν™•μ‹€ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

이 버그λ₯Ό 직접 λ°œκ²¬ν–ˆμŠ΅λ‹ˆλ‹€. -m ν”Œλž˜κ·Έκ°€ sys.argv μžˆμ„ κ²ƒμœΌλ‘œ μ˜ˆμƒν–ˆμ§€λ§Œ ν™•μ‹€νžˆ 그렇지 μ•ŠμŠ΅λ‹ˆλ‹€.

이에 λŒ€ν•œ ν•΄κ²° 방법이 μžˆμŠ΅λ‹ˆκΉŒ?

예, https://github.com/mitsuhiko/flask/issues/1246 에

2015 λ…„ 7 μ›” 9 일 15:08:30 CEST에 Wayne Werner [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

κ·ΈλŸ¬λ‚˜ 이것은 κ½€ ν•΄ν‚€ ν•œ ν•΄κ²° λ°©λ²•μž…λ‹ˆλ‹€ (그리고 Python <3.3μ—μ„œλ§Œ).

# 531의 ν˜„μž¬ κ΅¬ν˜„μ€μ΄ νŠΉμ • 문제λ₯Ό ν•΄κ²°ν•˜μ§€ λͺ»ν•˜λ©° μ•ˆνƒ€κΉκ²Œλ„ μ–΄λ–»κ²Œ ν•  수 μžˆλŠ”μ§€ μ•Œ 수 μ—†μŠ΅λ‹ˆλ‹€.

ν•œ λ²ˆμ€ λ‘œλ” 둜 고쳐 λ³΄λ €κ³ ν–ˆλŠ”λ° 크게 보 μ˜€λŠ”λ°
2μ—μ„œ 3κΉŒμ§€ λ‹€λ₯Έ 행동.

2015 λ…„ 9 μ›” 10 일 λͺ©μš”일 01:26:56 PM -0700에 Martijn VermaatλŠ” λ‹€μŒκ³Ό 같이 μΌμŠ΅λ‹ˆλ‹€.

리 λ‘œλ”κ°€ λͺ¨λ“ˆμ„ λΉ„ νŒ¨ν‚€μ§€λ‘œ μ‹€ν–‰ν•˜κΈ° λ•Œλ¬Έμ— μƒλŒ€ κ°€μ Έ μ˜€κΈ°κ°€ μ‹€νŒ¨ν•˜λŠ” λΉ„μŠ·ν•œ λ¬Έμ œκ°€ μžˆμŠ΅λ‹ˆλ‹€.

$ 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.serving weasyprint. navigator : app --reload --debug

  • http://127.0.0.1 : 5000 /μ—μ„œ μ‹€ν–‰ (μ’…λ£Œν•˜λ €λ©΄ CTRL + Cλ₯Ό λˆ„λ¦…λ‹ˆλ‹€)
  • stat둜 λ‹€μ‹œ μ‹œμž‘
    μ—­ 좔적 (κ°€μž₯ 졜근 호좜 λ§ˆμ§€λ§‰) :
    파일 "/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

_ νŽΈμ§‘ : 해결책이 λ°”λ‘œ μœ„μ— μžˆμŒμ„ κΉ¨λ‹¬μ•˜μŠ΅λ‹ˆλ‹€. : arrow_up : _

이 νŽ˜μ΄μ§€κ°€ 도움이 λ˜μ—ˆλ‚˜μš”?
0 / 5 - 0 λ“±κΈ‰