问题是这样的:
同一个机器两个用户:root和普通用户someone,由于Python3不再自带sqlite3,所以我需要安装sqlite后重新进行编译python,才可以实现import sqlite3。于是我在本地centos7.9上安装并重新编译python后import成功了,root和someone用户都ok。
但是我在云服务器的centos7.9上执行同样的安装、编译python,import sqlite3却只有在root下生效了,在someone下执行依然提示:
-bash-4.2$ python
Python 3.10.11 (main, Aug 29 2023, 02:31:25) [GCC 4.8.5 20150623 (Red Hat 4.8.5-44)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import sqlite3
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/local/lib/python3.10/sqlite3/__init__.py", line 57, in <module>
from sqlite3.dbapi2 import *
File "/usr/local/lib/python3.10/sqlite3/dbapi2.py", line 27, in <module>
from _sqlite3 import *
ImportError: dynamic module does not define module export function (PyInit__sqlite3)
>>>
我仔细检查了差异,发现竟然是root和someone的sys.path顺序不一样导致(先声明没有配置任何bashrc等的操作),虽然不知道这个循序差异是为什么,但是我试着在someone用户下执行export PYTHONPATH='/usr/local/lib/python3.10/site-packages'后,someone下的import sqlite3居然成功了。
但是是临时生效的,再次进入终端就没了,而且更加离谱的是即使配置到~/.bashrc或者/etc/bashrc依然无法解决永久生效的问题。
所以总结一下我遇到的问题:
引用 皆我百晓生 小程序回复内容作答:
关于您遇到的问题,我有以下解答:
sys.path是Python的模块搜索路径列表,在Python解释器启动时自动初始化。它由一系列的目录路径组成,用于查找Python模块文件。通常情况下,sys.path的初始化顺序如下:
导致sys.path顺序不一致的原因可能是在编译和安装Python时不同的用户设置了不同的配置选项,或者使用了不同的安装方式。为了确认具体原因,您可以在两台服务器上使用python -v
命令查看Python启动时的详细输出,包括初始化sys.path的过程。
要让export的环境变量永久生效,您可以将其添加到用户的初始化文件中,例如/.bashrc或者/.bash_profile。根据您的描述,尝试在~/.bashrc中添加类似以下内容,并确保文件中没有其他设置PYTHONPATH的命令。
export PYTHONPATH="/usr/local/lib/python3.10/site-packages:$PYTHONPATH"
然后执行source ~/.bashrc
命令使其生效,或者重新登录一次。这样,每次登录后PYTHONPATH环境变量都会被正确设置。
如果在添加到用户的初始化文件后仍然无法永久生效,可能存在其他问题。您可以检查是否存在其他对环境变量进行设置或重复设置的操作,比如其他的~/.bash_profile、/etc/profile、/etc/profile.d等文件。另外,请确保在设置完毕后重新启动终端,使环境变量生效。
希望以上解答对您有帮助!如需进一步了解,请随时提问。
【以下回答由 GPT 生成】
在Python中,sys.path是一个包含导入模块搜索路径的列表。当我们导入一个模块时,Python会按照sys.path列表中的路径顺序来查找对应的模块文件。
sys.path的默认设置包括以下几个部分: - 系统默认路径:Python会将一些系统级的安装路径添加到sys.path中,例如"/usr/lib/python3.10"。 - PYTHONPATH环境变量:如果设置了PYTHONPATH环境变量,Python会将其值作为额外的模块搜索路径。Python在启动时会检查这个环境变量,并将其包含的路径添加到sys.path中。 - 安装路径下的site-packages目录:Python会在安装路径下的"site-packages"目录中搜索模块。这个目录通常是第三方库的安装目录,Python会自动将其添加到sys.path中。
由于您手动安装了Python并重新编译,导致了sys.path的顺序不一致的情况。不同的系统和用户配置可能会导致sys.path的差异。
在您描述的情况下,希望导出的PYTHONPATH环境变量可以永久生效。您可以采取以下方法之一:
通过修改用户的.bashrc文件来设置PYTHONPATH环境变量,这样每个终端登录时都会自动加载环境变量。
vi ~/.bashrc
export PYTHONPATH='/usr/local/lib/python3.10/site-packages'
source ~/.bashrc
通过修改系统的/etc/profile文件来设置PYTHONPATH环境变量,这样对整个系统的所有用户都生效。
sudo vi /etc/profile
export PYTHONPATH='/usr/local/lib/python3.10/site-packages'
source /etc/profile
请注意,修改系统级的文件可能需要root权限。
在解决Python sys.path问题时,您可以通过修改用户的.bashrc文件或系统的/etc/profile文件来永久设置PYTHONPATH环境变量。这样可以确保导出的环境变量在每个终端中都生效,解决导入模块错误的问题。