Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在linux中创建系统文件时无法加载python包_Python_Python 3.x_Linux_Systemctl - Fatal编程技术网

在linux中创建系统文件时无法加载python包

在linux中创建系统文件时无法加载python包,python,python-3.x,linux,systemctl,Python,Python 3.x,Linux,Systemctl,我创建了一个简单的脚本,用于从python文件向AWS SQS发送消息。我已经进口了boto3软件包,并在当地进行了测试。 现在,当我试图创建一个服务文件并使用它运行它时,它说无法导入boto3,即使安装了boto3包(我使用pip freeze | grep boto3重新检查了它) 这是我的密码: import boto3 import json AWS_SQS_QUEUE_NAME = "XXXXXXXXX" class SQSQueue(object):

我创建了一个简单的脚本,用于从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'.
Sep 04 15:31:34 virtualhost systemd[1]:已启动访问服务。
九月四日15:31:35虚拟主机蟒蛇3[6877]:回溯(最近一次呼叫上次):
九月四日15:31:35虚拟主机python3[6877]:文件“/home/ubuntu/code/sample.py”,第1行,在
九月四日15:31:35虚拟主机蟒蛇3[6877]:导入bot3
Sep 04 15:31:35虚拟主机Python 3[6877]:ModuleNotFoundError:没有名为“boto3”的模块
Sep 04 15:31:35 virtualhost systemd[1]:sudoaccess.service:主进程退出,代码=退出,状态=1/失败
Sep 04 15:31:35 virtualhost systemd[1]:sudoaccess.service:失败,结果为“退出代码”。

问题是您已经将bot3安装为用户包,并且您正在以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

/usr/bin/python3-m pip list | grep boto3
的输出是什么?boto3 1.14.55,它返回这个。如果我通过/usr/lib/python3打开shell并在那里导入bot3,那么它也在导入,没有任何错误。我只想检查它是作为用户包安装的还是全局安装的。这个的输出是什么<代码>python3-c'导入boto3;print(boto3.\uuuu path\uuuuuuo3)['/home/aniket/.local/lib/python3.8/site packages/boto3']--它会返回此消息谢谢,我使用root用户安装了包,它工作正常,但您的解决方案越来越干净。谢谢你的帮助!是的,尽量保持“系统”Python尽可能干净,使用VirtualNVS,您可以在同一台服务器上部署具有不同需求和库版本的多个项目。