Pip3 为所有用户安装模块

Pip3 Install Module For All Users

不确定我是应该在这里还是在 Linux 堆栈溢出时问这个问题,但它就在这里。

我对 python 比较陌生,我一直在努力让这个 python 脚本在 aws 机器上自动启动。我有两个模块需要安装 "discord.py" 和 "watson-cloud-developer"。 pip3 安装上述模块没有错误。当尝试 运行 一个服务 运行 是一个 运行 是 python 脚本的脚本时(一定要喜欢 systemd),我收到一条错误消息,告诉我 discord 模块不是已安装,见下文。

Systemctl error

    ● discordbot.service
   Loaded: loaded (/etc/systemd/system/discordbot.service; static; vendor preset: enabled)
   Active: failed (Result: exit-code) since Sun 2019-03-03 17:16:00 UTC; 6s ago
  Process: 30567 ExecStart=/usr/local/sbin/startbot.sh (code=exited, status=1/FAILURE)
 Main PID: 30567 (code=exited, status=1/FAILURE)

Mar 03 17:16:00 ip-172-31-46-72 systemd[1]: Started discordbot.service.
Mar 03 17:16:00 ip-172-31-46-72 startbot.sh[30567]: Traceback (most recent call last):
Mar 03 17:16:00 ip-172-31-46-72 startbot.sh[30567]:   File "/home/ubuntu/discordBot/main.py", line 1, in <module>
Mar 03 17:16:00 ip-172-31-46-72 startbot.sh[30567]:     import discord
Mar 03 17:16:00 ip-172-31-46-72 startbot.sh[30567]: ModuleNotFoundError: No module named 'discord'
Mar 03 17:16:00 ip-172-31-46-72 systemd[1]: discordbot.service: Main process exited, code=exited, status=1/FAILURE
Mar 03 17:16:00 ip-172-31-46-72 systemd[1]: discordbot.service: Failed with result 'exit-code'.

Python3 proof that discord is installed

Python 3.6.7 (default, Oct 22 2018, 11:32:17)
[GCC 8.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import discord
>>>

我非常乐意提供任何其他信息。

编辑:

服务:

[Service]
ExecStart=/usr/local/sbin/startbot.sh

bash 脚本:

#!/bin/bash
python3 /home/ubuntu/discordBot/main.py

python 脚本:

import json
from watson_developer_cloud import VisualRecognitionV3

visual_recognition = VisualRecognitionV3(
            "2018-03-19",
            iam_apikey="{api-key}")

def ReturnWatsonResults(urlInput):
    classes_result = visual_recognition.classify(url=urlInput).get_result()
    imageResults = dict()

    for images in classes_result['images'][0]['classifiers'][0]['classes']:
        imageResults[images['class']]=str(images['score'] * 100)

    return imageResults

import discord
import watson
from discord.ext.commands import Bot

TOKEN = '{api-key}'

BOT_PREFIX = ("!", "$")

client = Bot(command_prefix=BOT_PREFIX)

@client.command(name="Memealyze",
        description="Send your favorite meme and the boys at IBM will get to work telling you what they see",
        brief="Neural network put to good use",
        pass_context=True)
async def GetMemeContents(context):
    await client.say("Sending image to the mothership, hold tight")

    messageContent = ""
    imageUrl = str(context.message.attachments[0]['url'])
    resultDict = watson.ReturnWatsonResults(imageUrl)

    for key,val in resultDict.items():
        messageContent += (key + ":" + val + "%" + "\n")

    await client.say("Done, the boys at IBM said they found this:\n" + messageContent)

client.run(TOKEN)

我知道 python 脚本写得不是很好,但它们确实有效,目前令人眼花缭乱的障碍完全在于 pip 安装模块的位置,出于某种原因,它们可以' 在被 systemd 运行 访问时被访问。

我怀疑您的启动脚本启动的 Python 与您安装 discord 的启动脚本不同。

尝试添加行,

import sys; print(sys.executable, sys.prefix)

到你的main.py,在import discord之前。并在 python3 shell 中尝试 运行ning。这应该打印出 Python 可执行文件和标准库分别安装的位置。如果它们在 main.py 中与在 shell 中不同,那是你的问题。

也试试

$ which python3
$ which pip3

一旦您知道 Python 可执行文件的路径,您实际上是 运行ning,您可以将 Python 的 pip 与

一起使用
$ foo -m pip install discord

其中 foo 是您在 main.py.

中使用 sys.executable 打印的 Python 可执行文件的完整路径

您也可以尝试将 discord 安装到虚拟环境。

$ python3 -m venv foo
$ source foo/bin/activate
$ pip install discord  # install all your other requirements too

其中 foo 是您可以将虚拟环境安装到的路径。然后在您的启动脚本中,在 运行ning main.py 之前激活源。这确保 python 将 运行 在您刚刚创建的相同 foo 环境中。

#!/bin/bash
source foo/bin/activate
python /home/ubuntu/discordBot/main.py

请注意,在活动的虚拟环境中,您使用 pythonpip,即使您使用 python3 创建了环境。