在 linux 中创建系统文件时无法加载 python 包
Unable to load python packages when creating a system file in linux
我创建了一个简单的脚本来将消息从 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'.
问题是您将 boto3 安装为用户包,而您 运行 systemd 服务作为 root
,这就是 Python 只能访问系统级别的原因包。
您有 2 个选择:
最简单的方法是在系统范围内安装 boto3,通过 运行 python3 -m pip install boto3
作为 root。
或者更简洁的部署方式是创建一个仅包含所需库的 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
我创建了一个简单的脚本来将消息从 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'.
问题是您将 boto3 安装为用户包,而您 运行 systemd 服务作为 root
,这就是 Python 只能访问系统级别的原因包。
您有 2 个选择:
最简单的方法是在系统范围内安装 boto3,通过 运行 python3 -m pip install boto3
作为 root。
或者更简洁的部署方式是创建一个仅包含所需库的 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