Set PYTHONSAFEPATH=1 in the units

The repos now sit directly under /srv/astrape, which is also every unit's
WorkingDirectory. Python prepends the working directory to sys.path for
'python -m', so the gibil checkout at /srv/astrape/gibil was shadowing the
installed package: the repo root has no __init__.py, so 'gibil' resolved as a
namespace portion with __file__ None, and submodules only resolved because a
namespace path recomputes itself on access.

Everything is installed into the venv, so nothing needs the working directory
on sys.path. WorkingDirectory still matters for env/ and models/.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
rpotter6298
2026-08-30 14:33:25 +02:00
parent 6c94a28298
commit 09e7155b47
4 changed files with 24 additions and 0 deletions
+6
View File
@@ -10,6 +10,12 @@ Group=gibil
WorkingDirectory=/srv/astrape
Environment=PYTHONUNBUFFERED=1
Environment=PYTHONDONTWRITEBYTECODE=1
# WorkingDirectory is /srv/astrape, which also holds the gibil checkout. Without
# this, Python prepends the working directory to sys.path and the repo root
# /srv/astrape/gibil shadows the installed package as a namespace portion --
# gibil.__file__ becomes None and imports work only by accident. All code is
# installed into the venv, so nothing needs the working directory on sys.path.
Environment=PYTHONSAFEPATH=1
Environment=ASTRAPE_ORACLE_POLL_SECONDS=300
ExecStart=/srv/astrape/.venv/bin/python -m astrape_oracle.scripts.daemons.oracle_daemon
Restart=always
@@ -10,6 +10,12 @@ Group=gibil
WorkingDirectory=/srv/astrape
Environment=PYTHONUNBUFFERED=1
Environment=PYTHONDONTWRITEBYTECODE=1
# WorkingDirectory is /srv/astrape, which also holds the gibil checkout. Without
# this, Python prepends the working directory to sys.path and the repo root
# /srv/astrape/gibil shadows the installed package as a namespace portion --
# gibil.__file__ becomes None and imports work only by accident. All code is
# installed into the venv, so nothing needs the working directory on sys.path.
Environment=PYTHONSAFEPATH=1
# This host is a Xeon E5-2650 v2: no AVX2, no FMA. Torch dispatches kernels it
# cannot execute and dies with SIGILL inside Adam, so force the scalar path.
# The real fix is external_tcn on a GPU host; this keeps the local run alive
@@ -10,6 +10,12 @@ Group=gibil
WorkingDirectory=/srv/astrape
Environment=PYTHONUNBUFFERED=1
Environment=PYTHONDONTWRITEBYTECODE=1
# WorkingDirectory is /srv/astrape, which also holds the gibil checkout. Without
# this, Python prepends the working directory to sys.path and the repo root
# /srv/astrape/gibil shadows the installed package as a namespace portion --
# gibil.__file__ becomes None and imports work only by accident. All code is
# installed into the venv, so nothing needs the working directory on sys.path.
Environment=PYTHONSAFEPATH=1
ExecStart=/srv/astrape/.venv/bin/python -m astrape_oracle.scripts.daemons.weather_forecast_daemon
Restart=always
@@ -10,6 +10,12 @@ Group=gibil
WorkingDirectory=/srv/astrape
Environment=PYTHONUNBUFFERED=1
Environment=PYTHONDONTWRITEBYTECODE=1
# WorkingDirectory is /srv/astrape, which also holds the gibil checkout. Without
# this, Python prepends the working directory to sys.path and the repo root
# /srv/astrape/gibil shadows the installed package as a namespace portion --
# gibil.__file__ becomes None and imports work only by accident. All code is
# installed into the venv, so nothing needs the working directory on sys.path.
Environment=PYTHONSAFEPATH=1
Environment=ECOWITT_GW3000_HOST=10.24.88.176
Environment=ECOWITT_GW3000_POLL_SECONDS=60
ExecStart=/srv/astrape/.venv/bin/python -m astrape_oracle.scripts.daemons.weather_station_daemon