Python 否则运行代码的ok赢了';不要在系统下运行

Python 否则运行代码的ok赢了';不要在系统下运行,python,raspberry-pi,systemd,debian-stretch,Python,Raspberry Pi,Systemd,Debian Stretch,我这边的另一个新手问题:) 我试着去查,但在这种情况下我找不到任何有意义的东西。 我有这个代码,在正常情况下运行良好 import automationhat import bluetooth import time import sys import telegram bot = telegram.Bot(token='56915444444:AAEzP5jy-pMD3ZME0twxY5bXkxxxxxxxxxxxxxxxxxxd_U') # Import Adafruit IO MQT

我这边的另一个新手问题:) 我试着去查,但在这种情况下我找不到任何有意义的东西。 我有这个代码,在正常情况下运行良好

import automationhat
import bluetooth
import time
import sys
import telegram

bot = telegram.Bot(token='56915444444:AAEzP5jy-pMD3ZME0twxY5bXkxxxxxxxxxxxxxxxxxxd_U')


# Import Adafruit IO MQTT client.
from Adafruit_IO import MQTTClient


ADAFRUIT_IO_KEY      = '73c755488accccccc361a506f700000002ba'
ADAFRUIT_IO_USERNAME = 'flxxxxxxxx'


def connected(client):
    print('Connected to Adafruit IO!  Listening for LockReg changes...')
    # Subscribe to changes on a feed named LockReg.
    client.subscribe('LockReg')

def disconnected(client):
    print('Disconnected from Adafruit IO!')
    sys.exit(1)

def message(client, feed_id, payload, retain):
    print('Feed {0} received new value: {1}'.format(feed_id, payload))

client = MQTTClient(ADAFRUIT_IO_USERNAME, ADAFRUIT_IO_KEY)

# Setup the callback functions defined above.
client.on_connect    = connected
client.on_disconnect = disconnected
client.on_message    = message

PHONES = ['B0:xx:2D:x0:C9:xx', 'xx:8D:08:xx:C3:7C', 'xx:AB:37:EA:93:xx']

while True:

        print "Checking " + time.strftime("%a, %d %b %Y %H:%M:%S", time.gmtime())

        for device in PHONES:
                result = bluetooth.lookup_name(device, timeout=5)
                if (result != None):
                    # Connect to the Adafruit IO server.
            client.connect()
            print('Door unlocked. Nearby: %s (%s)' % (result, device))
                        client.publish('lock.reg', result)
                        automationhat.relay.one.on()
                        time.sleep(2)
                        automationhat.relay.one.off()
            bot.sendMessage(-26934xxxxx, result)
                        time.sleep(180)
                else:
                        print "User out of range"
                        print('Door locked: No Bluetooth device detected. ' )
        time.sleep(10)
我的systemd lock.service文件如下所示:

[Unit]
 Description=My Lock  Service
 After=multi-user.target

 [Service]
 Type=idle
 ExecStart=/usr/bin/python /home/pi/lockreg.py > /home/pi/lock.log 2>&1

 [Install]
 WantedBy=multi-user.target
但如果在初次启动时从systemd执行,我会收到以下错误消息:

pi@raspberrypi:~ $ systemctl status lock.service
● lock.service - My Lock  Service
   Loaded: loaded (/lib/systemd/system/lock.service; enabled; vendor preset: enabled)
   Active: failed (Result: exit-code) since Sat 2018-06-16 18:33:32 CEST; 29min ago
  Process: 492 ExecStart=/usr/bin/python /home/pi/lockreg.py > /home/pi/lock.log 2>&1 (
 Main PID: 492 (code=exited, status=1/FAILURE)

Jun 16 18:33:29 raspberrypi systemd[1]: Started My Lock  Service.
Jun 16 18:33:32 raspberrypi python[492]: Traceback (most recent call last):
Jun 16 18:33:32 raspberrypi python[492]:   File "/home/pi/lockreg.py", line 11, in <mod
Jun 16 18:33:32 raspberrypi python[492]:     import telegram
Jun 16 18:33:32 raspberrypi python[492]: ImportError: No module named telegram
Jun 16 18:33:32 raspberrypi systemd[1]: lock.service: Main process exited, code=exited,
Jun 16 18:33:32 raspberrypi systemd[1]: lock.service: Unit entered failed state.
Jun 16 18:33:32 raspberrypi systemd[1]: lock.service: Failed with result 'exit-code'.
pi@raspberrypi:~$systemctl状态锁。服务
● 锁服务-我的锁服务
已加载:已加载(/lib/systemd/system/lock.service;已启用;供应商预设:已启用)
活动:自Sat 2018-06-16 18:33:32 CEST以来失败(结果:退出代码);29分钟前
进程:492 ExecStart=/usr/bin/python/home/pi/lockreg.py>/home/pi/lock.log 2>&1(
主PID:492(代码=退出,状态=1/故障)
6月16日18:33:29 raspberrypi systemd[1]:开始我的锁服务。
Jun 16 18:33:32 raspberrypi python[492]:回溯(最近一次调用last):

6月16日18:33:32 raspberrypi python[492]:文件“/home/pi/lockreg.py”,第11行,在中有一些可能是错误的

可能是
telegram
仅为用户
pi
安装,而不是为所有用户全局安装。请检查
/home/pi/.local/
,查看是否可以在那里找到telegram

如果没有,您希望模块安装在您的系统范围
站点软件包
目录中。请使用以下方法查找:

> python
Python 2.7.15 (default, May 11 2018, 15:54:10) 
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> [p for p in sys.path if p.endswith('site-packages')]
['/usr/local/lib/python2.7/site-packages']
>>>
(对于您来说,它可能是一个不同的目录,因为我的
python
位于
/usr/local/bin

然后检查
电报
是否作为文件或子目录安装在
站点软件包
目录中

这也可能是权限问题。Systemd正在以特定用户id运行您的程序。请检查
站点包
目录和
电报
子目录是否可供该特定用户读取

编辑:
Systemd
可以在两种模式下运行:系统模式和用户模式。只有用户模式作为特定用户运行。我猜系统模式是以
根用户模式运行的。从
锁.service
文件的位置,我推断您正在系统模式下使用Systemd。根据您的评论,仅安装了电报对于用户
pi
。因此作为
root
运行的
python
不应该看到它,这正是您所经历的

所以基本上你有两个选择:

  • 为所有用户安装
    telegram
    。(以
    root用户身份运行安装)
  • 以用户
    pi
    身份运行用户模式systemd

您已经安装了
telegram
全局或
virtualenv
?请确保在这两种情况下使用相同的python解释器。@zimdero全局,因为我从未安装过virtualenv。我如何检查?@gonczor不确定如何设置不同的解释器…您可以从命令行运行
/usr/bin/python/home/pi/lockreg.py
它能工作吗?我检查了电报的安装位置:~/.local/lib/python2.7/site-packages/telegamls-l site packages drwxr-xr-x 9 pi 4096 Jun 15 09:01 telegamls-l python2.7 drwx------74 pi 4096 Jun 15 09:01 site packages@Roland smith我假设systemd以登录用户(pi)身份运行程序.对我来说权限看起来还可以。对吗?以root用户身份安装。谢谢!