TK-IT / web

TÅGEKAMMERETs hjemmeside i Django. Både offentlig og intern
https://TAAGEKAMMERET.dk
Other
1 stars 3 forks source link

Don't use pipenv in cron script #224

Closed Mortal closed 5 years ago

Mortal commented 6 years ago

Since pipenv is not installed on the system $PATH, and pipenv uses click which requires a non-ASCII locale, it is quite a bother to use pipenv in a crontab. Just use the standard virtualenv location instead to locate the Python interpreter.

Mortal commented 6 years ago

@Tyilo @neic Jeg har deployet denne PR på prodekanus da BEST opdagede at kalenderen på hjemmesiden ikke fulgte med Google-kalenderfeedet. Hvis der er en bedre måde må I sige til. Jeg prøvede at ændre cronjobbet til script -qc "bash -i /home/tkammer/tkweb/cron.sh >>/home/tkammer/tkweb/cron.log 2>&1" /dev/null (thi dette sætter $PATH korrekt), men det er grimt, er ikke i Git, og løste ikke problemet; click brokker sig over ASCII locale og foreslår at sætte LC_ALL=C.UTF-8:

Traceback (most recent call last):
  File "/home/tkammer/.local/bin/pipenv", line 11, in <module>
    sys.exit(cli())
  File "/home/tkammer/.local/lib/python3.5/site-packages/pipenv/vendor/click/core.py", line 722, in __call__
    return self.main(*args, **kwargs)
  File "/home/tkammer/.local/lib/python3.5/site-packages/pipenv/vendor/click/core.py", line 676, in main
    _verify_python3_env()
  File "/home/tkammer/.local/lib/python3.5/site-packages/pipenv/vendor/click/_unicodefun.py", line 118, in _verify_python3_env
    'for mitigation steps.' + extra)
RuntimeError: Click will abort further execution because Python 3 was configured to use ASCII as encoding for the environment.  Consult http://click.pocoo.org/python3/for mitigation steps.

This system supports the C.UTF-8 locale which is recommended.
You might be able to resolve your issue by exporting the
following environment variables:

    export LC_ALL=C.UTF-8
    export LANG=C.UTF-8
tyilo commented 6 years ago

Hvad med at lave en .env fil (ved siden af Pipfile) der indeholder:

LC_ALL=C.UTF-8
LANG=C.UTF-8

Virker det?

neic commented 6 years ago

Det er vel ikke sikkert at venv altid ligger der. Jeg syntes dog det er fint for nu. Når vi får det i docker https://github.com/TK-IT/meta/issues/18, kan vi tilføje cronjobbet til vores Dockerfile.

Jeg er netop nu ved at få ddweb i docker. Jeg tænker ikke der går så lang tid inden jeg også gør det med tkweb.

Mortal commented 6 years ago

Hvad med at lave en .env fil (ved siden af Pipfile) der indeholder: ...

Den fil bliver vel ikke brugt på nogen magisk vis? Mener du at source filen i cron.sh? Filens tilstedeværelse ændrer ikke fejlen fra pipenv:

(tkweb)tkammer@prodekanus:~/tkweb$ cat .env
LC_ALL=C.UTF-8
LANG=C.UTF-8
(tkweb)tkammer@prodekanus:~/tkweb$ env -i /bin/bash -ic pipenv
Traceback (most recent call last):
...

Det er vel ikke sikker at venv altid ligger der.

Vores readme-prodekanus.md sikrer at venv altid ligger i .venv.

tyilo commented 6 years ago

Den fil bliver vel ikke brugt på nogen magisk vis? Mener du at source filen i cron.sh? Filens tilstedeværelse ændrer ikke fejlen fra pipenv:

Jo det skulle den gerne: https://github.com/pypa/pipenv/blob/master/docs/advanced.rst#-automatic-loading-of-env

neic commented 6 years ago

Vores readme-prodekanus.md sikrer at venv altid ligger i .venv.

Super. Ved nærmere eftertanke, så bruger man nok nærmere ./manage.py updateical end cron.sh under udvikling.

Mortal commented 6 years ago

Den fil bliver vel ikke brugt på nogen magisk vis? Mener du at source filen i cron.sh? Filens tilstedeværelse ændrer ikke fejlen fra pipenv:

Jo det skulle den gerne: https://github.com/pypa/pipenv/blob/master/docs/advanced.rst#-automatic-loading-of-env

Den loader filen, men den gør det sikkert for sent til at det løser det indeværende problem:

tkammer@prodekanus:~/tkweb$ echo $LANG
en_US.UTF-8
tkammer@prodekanus:~/tkweb$ pipenv shell
Loading .env environment variables...
Launching subshell in virtual environment…
tkammer@prodekanus:~/tkweb$  . /home/tkammer/tkweb/.venv/bin/activate
(tkweb)tkammer@prodekanus:~/tkweb$ echo $LANG
C.UTF-8
tyilo commented 6 years ago

Hmm, en_US.UTF-8 burde også være fint. Er der andre LC eller LANG variable defineret i env'et?

On Wed, Aug 15, 2018, 12:22 Mathias Rav notifications@github.com wrote:

Den fil bliver vel ikke brugt på nogen magisk vis? Mener du at source filen i cron.sh? Filens tilstedeværelse ændrer ikke fejlen fra pipenv:

Jo det skulle den gerne: https://github.com/pypa/pipenv/blob/master/docs/advanced.rst#-automatic-loading-of-env

Den loader filen, men den gør det sikkert for sent til at det løser det indeværende problem:

tkammer@prodekanus:~/tkweb$ echo $LANG en_US.UTF-8 tkammer@prodekanus:~/tkweb$ pipenv shell Loading .env environment variables... Launching subshell in virtual environment… tkammer@prodekanus:~/tkweb$ . /home/tkammer/tkweb/.venv/bin/activate (tkweb)tkammer@prodekanus:~/tkweb$ echo $LANG C.UTF-8

— You are receiving this because you were mentioned. Reply to this email directly, view it on GitHub https://github.com/TK-IT/web/pull/224#issuecomment-413156037, or mute the thread https://github.com/notifications/unsubscribe-auth/AAiq5HRaC3hDcD2cUdUOj1JRNhPMXGEpks5uQ_ZLgaJpZM4V926f .

Mortal commented 6 years ago

en_US.UTF-8 bliver sat et eller andet sted for login og/eller interactive shells, men bliver ikke sat for cron. pipenv virker fint i en almindelig interactive shell når locale er en_US.UTF-8, og i dette tilfælde læser pipenv fint .env filen.

cron sætter intet locale, og så nægter pipenv at køre inden den opdager at der findes en .env fil.

Mortal commented 6 years ago

En anden løsning er at skifte fra Python 3.5 til Python 3.7 hvor problemet er løst med PEP 538:

Accordingly, this PEP proposes that [...] the way the CPython implementation handles the default C locale be changed to be roughly equivalent to the following existing configuration settings (supported since Python 3.1):

LC_CTYPE=C.UTF-8 PYTHONIOENCODING=utf-8:surrogateescape

Følgende er kørt på min Arch Linux maskine (env -i fjerner alle environment variables):

rav@novascotia:~$ env -i .pyenv/versions/3.6.6/bin/python -c 'import sys; print(sys.getfilesystemencoding())'
ascii
rav@novascotia:~$ env -i python3.7 -c 'import sys; print(sys.getfilesystemencoding())'
utf-8

Og på prodekanus:

rav@prodekanus:~$ env -i python3.5 -c 'import sys; print(sys.getfilesystemencoding())'
ascii
neic commented 6 years ago

@Mortal django 1.11 LTS understøtter ikke python 3.7. Se også #205.

Mortal commented 5 years ago

Vores readme-prodekanus.md sikrer at venv altid ligger i .venv.

Super. Ved nærmere eftertanke, så bruger man nok nærmere ./manage.py updateical end cron.sh under udvikling.

Ud fra denne observation merger jeg. Desuden har vi kørt med denne PR i production i en måned nu.