贡献者: addis
pip 是 python 的默认包管理器,最广泛使用。另外也可以用 conda,但不能免费商用。
python 在运行时从哪里搜索包(module)?如果 import 命令搜不到,会出现错误 ModuleNotFoundError。答案是在(import sys)sys.path 中,而其中列出的路径按优先级有三个来源:1. 当前路径. 2. 环境变量 PYTHONPATH。3. sys.path 中的其他默认路径。这可以直接在代码中修改,如 sys.path.append('some/folder')。
模块名.__file__ 查看 module 的文件路径。
sudo apt install python3 python3-pip
pip3 ... 和 python3 -m pip ... 应该是一样的,见这里。
pip3 install numpy
pip3 list 列出所有包,pip3 show 包名 列出某个包的信息,包括安装路径。
pip3 uninstall 包名
wget https://www.python.org/ftp/python/3.6.3/Python-3.6.3.tgz 解压 tar -xvf Python-3.6.3.tgz,cd Python-3.6.3,apt-get install build-essential zlib1g-dev,./configure,make(可以加 -j4 选项),make install 就可以了。检查版本:python3.6 -V,但安装 3.10 的时候会出现编译错误。
Python Package Index (PyPI) 是 pip 中安装包的主要来源(注意区分 PyPy)。
pip3 install 包名称 中的名称未必是 import 包名称 的名称! 如果找不到前者,会提示 Could not find a version that satisfies the requirement
python 命令的路径一般是 /usr/bin/python,它是一个 soft link,链接到具体版本。注意如果直接修改这个连接可能会发生一些错误(导致 lsb_release 不能用等)
module 的代码中,如果 module 是被 import 的,那么 __name__(被 import 以后就是 包名.__name__)是包的名字,但是如果 module 是作为 script 来执行的(python3 -m 包名),那么 __name__ 就是 '__main__',在 module 中,if __name__ == '__main__' 可以用于判断到底是哪种情况。
python3 test.py),那么 __name__ 同样也是 '__main__'。
python3 -m 包名称 参数... 相当于把 module import 以后再 run as script。
有时候我们希望同一个 .py 文件既可以作为脚本直接执行也可以作为模块被导入,并且希望该文件可以根据这两种方式自动选择执行什么。这时可以用 __name__ 来判断:
#!/usr/bin/python3
# 执行一些命令(无论作为脚本还是模块都会被运行)
# 被赋值的变量会作为模块的全局变量, 定义的函数会作为模板中的函数
print('欢迎使用 my_module.py')
def plus1(num):
return num + 1
num = 3.5
num2 = plus1(num)
if __name__ == '__main__':
# 脚本模式下运行的命令
print('正在被作为脚本执行, __name__ 的值为 __main__')
else:
# 作为模块导入时运行的命令
print('正在被作为模块导入, __name__ 的值为', __name__)
若运行 ./my_module.py 或者 python3 my_module.py 或者 python3 -m my_module,就会得到(-m 选项把模块作为脚本运行)
欢迎使用 my_module.py
正在被作为脚本执行, __name__ 的值为 __main__
若在同目录下进入 python3 运行 import my_module(或者 import my_module as 其他名字),就会得到
欢迎使用 my_module.py
正在被作为模块导入, __name__ 的值为 my_module
再来写另一个模块调用上面的模块
#!/usr/bin/python3
print('欢迎使用 my_module2.py')
def plus2(num):
return num + 2
if __name__ == '__main__':
# 脚本模式下运行的命令
print('正在被作为脚本执行, __name__ 的值为 __main__')
else:
# 作为模块导入时运行的命令
print('正在被作为模块导入, __name__ 的值为', __name__)
import my_module
在同目录打开命令行,运行
>>> import my_module2
欢迎使用 my_module2.py
正在被作为模块导入, __name__ 的值为 my_module2
欢迎使用 my_module.py
正在被作为模块导入, __name__ 的值为 my_module
>>> my_module2.plus2(2)
4
>>> my_module2.my_module.plus1(2)
3
>>> my_module2.my_module.plus1.__module__
'my_module'
>>> my_module2.plus2.__module__
'my_module2'
# fun.__globals__['__file__'] 可以查看一个函数是在哪个文件中定义的(不能是 builtin 函数)。
>>> my_module2.plus2.__globals__['__file__']
'/mnt/c/Users/addis/Desktop/my_module2.py'
>>> my_module2.my_module.plus1.__globals__['__file__']
'/mnt/c/Users/addis/Desktop/my_module.py'
import 一个包时,Python 以什么顺序在哪些路径搜索所需的包呢?参考官方文档。
import site 和 site.getsitepackages() 查看。 例如 Ubuntu22.04 下 pip 的默认安装目录为 /usr/local/lib/python3.10/dist-pakages,但如果没有管理员权限,会安装到用户文件夹的 ~/.local/lib/python3.10/site-packages 中。
pip show 包名 可以查到包的安装路径以及依赖的其他库等信息。