![](/img/trans.png)
[英]Python script runs flawless when executed in shell, but throws unicode errors when executed as systemd service
[英]Systemd service does not write python script to file, python script runs nominally when executed from cli
使用覆盆子pi零w,設置一個腳本,用於監視bme280傳感器,並將值寫入文件。 當從命令行啟動腳本時,這非常有效,當通過systemd啟動腳本時,不會寫入文件。 請在下面找到腳本和systemd服務。
已將標准輸出設置為絕對路徑而沒有運氣,python腳本寫入指令也設置為絕對路徑。
系統服務:
[Unit]
Description=bme280 sensor log startup
After=network.target
[Service]
ExecStart=/usr/bin/python3 -u /home/pi/bme.py
WorkingDirectory=/home/pi
StandardOutput=file:/home/pi/senselog.csv
StandardError=inherit
Restart=always
User=pi
[Install]
WantedBy=multi-user.target
python腳本:
import time
from time import strftime
import board
import busio
import adafruit_bme280
# Create library object using our Bus I2C port
i2c = busio.I2C(board.SCL, board.SDA)
bme280 = adafruit_bme280.Adafruit_BME280_I2C(i2c,address=0x76)
# OR create library object using our Bus SPI port
#spi = busio.SPI(board.SCK, board.MOSI, board.MISO)
#bme_cs = digitalio.DigitalInOut(board.D10)
#bme280 = adafruit_bme280.Adafruit_BME280_SPI(spi, bme_cs)
# change this to match the location's pressure (hPa) at sea level
bme280.sea_level_pressure = 1013.25
with open("/home/pi/senselog.csv", "a") as log:
while True:
temp_h = bme280.temperature
humidity = bme280.humidity
pressure = bme280.pressure
log.write("{0},{1}\n".format(strftime("%Y-%m-%d %H:%M:%S"),str([temp_h,humidity,pressure])))
time.sleep(60)
如果我刪除了senselog.csv文件,那么在啟動時,systemd服務會創建文件,但沒有數據,任何幫助都表示贊賞。
只有systemd
版本236才能使用StandardOutput
的file
屬性。您有什么版本?
pi@wifi-relay:~ $ systemd --version
systemd 232
+PAM +AUDIT +SELINUX +IMA +APPARMOR +SMACK +SYSVINIT +UTMP +LIBCRYPTSETUP +GCRYPT +GNUTLS +ACL +XZ +LZ4 +SECCOMP +BLKID +ELFUTILS +KMOD +IDN
如果它低於版本236並且您不能/不想升級,您只需將ExecStart
行更新為:
/usr/bin/python3 -u /home/pi/bme.py >1 /home/pi/senselog.csv
...然后將StandardOutput
線恢復為默認值。
因此,解決方案是在python腳本中實際調用我們正在寫入的文件上的.close(),然后systemd服務按預期工作。 大聲呼吁這個帖子: https ://askubuntu.com/questions/83549/python-script-wont-write-data-when-ran-from-cron最后一個答案= f.close()
和工作腳本文件:
from time import strftime
import board
import busio
import adafruit_bme280
# Create library object using our Bus I2C port
i2c = busio.I2C(board.SCL, board.SDA)
bme280 = adafruit_bme280.Adafruit_BME280_I2C(i2c,address=0x76)
# OR create library object using our Bus SPI port
#spi = busio.SPI(board.SCK, board.MOSI, board.MISO)
#bme_cs = digitalio.DigitalInOut(board.D10)
#bme280 = adafruit_bme280.Adafruit_BME280_SPI(spi, bme_cs)
# change this to match the location's pressure (hPa) at sea level
bme280.sea_level_pressure = 1013.25
with open("/home/pi/senselog.csv", "w") as log:
while True:
temp_h = bme280.temperature
humidity = bme280.humidity
pressure = bme280.pressure
log.write("{0},{1}\n".format(strftime("%Y-%m-%d %H:%M:%S"),str([temp_h,humidity,pressure])))
log.close()
time.sleep(60) ```
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.