【问题标题】:Unable to load python packages when creating a system file in linux在linux中创建系统文件时无法加载python包
【发布时间】:2020-12-23 14:41:51
【问题描述】:

我创建了一个简单的脚本来从 python 文件向 AWS SQS 发送消息。我已经导入了 boto3 包并在本地进行了测试。 现在,当我尝试创建一个服务文件并使用它运行它时,它说无法导入 boto3,即使安装了 boto3 包(我使用 pip freeze | grep boto3 重新检查了它)

这是我的代码:

import boto3
import json
AWS_SQS_QUEUE_NAME = "XXXXXXXXX"


class SQSQueue(object):
    def __init__(self, queueName=None):
        self.resource = boto3.resource('sqs',region_name="ap-south-1")
        self.queue = self.resource.get_queue_by_name(QueueName=AWS_SQS_QUEUE_NAME)
        self.QueueName = queueName
    
    def send(self, Message={}):
        data = json.dumps(Message)
        response = self.queue.send_message(MessageBody=data)
        return response
    
if __name__ == '__main__':
    q = SQSQueue(queueName=AWS_SQS_QUEUE_NAME)
    message = {
        "user": "XXXX",
        "timestamp": "2020-03-04 18:06:09"
    }
    
    response = q.send(Message=message)

我的服务文件

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

[Service]
Type=simple
User=root
Group=root
ExecStart=/usr/bin/python3 /home/ubuntu/code/sample.py

[Install]
WantedBy=multi-user.target

我也尝试创建一个 bash 文件并从那里调用 python 文件,但它给出了同样的错误

错误:

Sep 04 15:31:34 virtualhost systemd[1]: Started Access Service.
Sep 04 15:31:35 virtualhost python3[6877]: Traceback (most recent call last):
Sep 04 15:31:35 virtualhost python3[6877]:   File "/home/ubuntu/code/sample.py", line 1, in <module>
Sep 04 15:31:35 virtualhost python3[6877]:     import boto3
Sep 04 15:31:35 virtualhost python3[6877]: ModuleNotFoundError: No module named 'boto3'
Sep 04 15:31:35 virtualhost systemd[1]: sudoaccess.service: Main process exited, code=exited, status=1/FAILURE
Sep 04 15:31:35 virtualhost systemd[1]: sudoaccess.service: Failed with result 'exit-code'.

【问题讨论】:

  • /usr/bin/python3 -m pip list | grep boto3 的输出是什么?
  • boto3 1.14.55,它返回这个。如果我通过 /usr/lib/python3 打开 shell 并在那里导入 boto3,它也会在没有任何错误的情况下导入它
  • 我只想检查它是作为用户包还是全局安装的。这有什么输出? python3 -c 'import boto3; print(boto3.__path__)'
  • ['/home/aniket/.local/lib/python3.8/site-packages/boto3'] -- 它返回这个

标签: python python-3.x linux systemctl


【解决方案1】:

问题是您将 boto3 作为用户包安装,并且以 root 运行 systemd 服务,这就是 Python 只能访问系统级包的原因。

你有两个选择:

简单的方法是在系统范围内安装 boto3,以 root 身份运行 python3 -m pip install boto3

或者更简洁的部署方式是创建一个仅包含所需库的 virtualenv:

python3 -m venv /home/ubuntu/myenv/
source /home/ubuntu/myenv/bin/activate
pip install boto3

然后在服务定义上使用该 virtualenv:

[Service]
Type=simple
User=ubuntu
Group=ubuntu
ExecStart=/home/ubuntu/myenv/bin/python /home/ubuntu/code/sample.py

【讨论】:

  • 谢谢您,我使用 root 用户安装了该软件包并且它可以工作,但是您的解决方案更加简洁和简洁。谢谢
  • 很高兴为您提供帮助!是的,尽量让你的“系统”Python 保持干净,使用 virtualenvs,你可以在同一台服务器上部署多个具有不同要求和库版本的项目。
猜你喜欢
  • 2010-10-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-20
  • 2022-11-02
  • 2011-04-22
相关资源
最近更新 更多