我觉得这个问题已经被提出并解决了,但我找不到一个适合我的解决方案。我导入了一个python库,并验证它确实在我的系统上。
pi@raspberrypi:~/Desktop $ pip3 install pyftpdlib
Looking in indexes: https://pypi.org/simple, https://www.piwheels.org/simple
Requirement already satisfied: pyftpdlib in /home/pi/.local/lib/python3.7/site-packages (1.5.6)
然后我尝试导入它,但是raspi找不到它…
pi@raspberrypi:~/Desktop $ sudo python3 FTPserver2.py
Traceback (most recent call last):
File "FTPserver2.py", line 1, in <module>
import pyftpdlib
ModuleNotFoundError: No module named 'pyftpdlib'
啊?
当您运行pip3 install
而不运行sudo
时,包将安装在/home/pi/.local/lib/python3.7/site-packages
下,这是一个用户特定的位置,并且安装在那里的包将无法在系统范围内访问。然后您运行sudo python3
,这使得您作为root
用户执行python3
,这是一个不同的用户。
下面我假设你做需要使用sudo
执行该命令。如果你不确定,试着放弃sudo
-然后导入应该工作(但也许其他东西不会-我不知道你的脚本中有什么)。
安装root
使用的包的一种方法是执行sudo pip3 install pyftpdlib
,但不建议这样做,因为它可能会破坏操作系统使用的Python安装(有些包可能必须更新以与pyftpdlib
兼容,但它们可能会与其他东西不兼容,然后你就有很多麻烦了)。
最好使用虚拟环境。例如:
# create the virtual environment
$ python3 -m venv env-ftp
# install the package into it
$ env-ftp/bin/python -m pip install pyftpdlib
# run a script using the Python installation contained within the virtual environment
$ sudo env-ftp/bin/python -m Desktop/FTPserver2.py
您也可以选择source env-ftp/bin/activate
,以便临时切换到使用特定于此环境的python
和pip
,直到您使用deactivate
。
虚拟环境对于创建具有自己独立包集的独立Python安装非常有用,这允许您同时使用具有不兼容依赖集的应用程序(假设一个应用程序需要requests==2.22.0
,另一个需要requests<=2.21.0
,并且不能与requests==2.22.0
一起工作)。
你能试着在命令行中运行它而不出现错误吗?:
python3 -c "import pyftpdlib"
如果这没有返回错误,这意味着你的python解释器是不同的。请确保您没有运行不同的python版本和/或创建了不同的映像,并且没有使用sudo权限来安装软件包。
可以看到,pip3
已经将其安装在/home/pi/.local/lib/python3.7/
的site包中。在命令行中运行
python3 -c "import site; print(site.getsitepackages())"
并检查它是否返回与pip相同的路径。
PS:始终建议运行pip3 install --user
而不是sudo pip3 install
。