- 前言
python开发中对一些无网的环境,需要安装python包怎么办?有三种方式 - 第一种: 手动安装
- 去pypi官网(国外网站一般不通)
- 或者国内镜像源
(1)阿里云 http://mirrors.aliyun.com/pypi/simple/ (2)豆瓣http://pypi.douban.com/simple/ (3)清华大学 https://pypi.tuna.tsinghua.edu.cn/simple/ (4)中国科学技术大学 http://pypi.mirrors.ustc.edu.cn/simple/ (5)华中科技大学http://pypi.hustunique.com/
http://mirrors.aliyun.com/pypi/simple/requests
,可以看到如下画面
此时可以选择版本下载,然后解压安装,这一步不赘述
缺点就是无法自动安装依赖,需要手动安装每一个依赖,这个第二种方式可以自动收集依赖。
- 第二种: pip download+install
本质同第一步,只是可以采用批量脚本来收集库和依赖
下面给出一个可用脚本, 改巴改巴就能用, 比如在开发环境download
到需要的包和依赖,到生产环境直接install
""" 自动根据脚本配置安装 python包 python第三方包如何安装? 开发端包收集 pip download -i "https://mirrors.aliyun.com/pypi/simple/" -d ./ lxml - 下载 `lxml` 包 pip download -i "https://mirrors.aliyun.com/pypi/simple/" -d ./ -r requirement.txt - 下载 requirement.txt 生产端 pip install --no-index --ignore-installed --find-links=./ lxml pip install --no-index --ignore-installed --find-links=./ -r requirements.txt """ import os import subprocess import traceback class Pip: def __init__(self, path): self.soft_source = "https://mirrors.aliyun.com/pypi/simple/" self.package_pre = f"{path}/models" def _venv(self, model: str): base_path = os.path.join(self.package_pre, model) path = os.path.join(os.path.join(base_path, "my_venv")) if not os.path.exists(path): os.makedirs(path) with open("__init__.py", "w"): pass else: if not os.path.exists(os.path.join(path, "__init__.py")): with open("__init__.py", "w"): pass def download(self, package: str, model: str, version=None): base_path = os.path.join(self.package_pre, model) path = os.path.join(os.path.join(base_path, "package", package)) if not os.path.exists(path): os.makedirs(path) if not package.endswith("txt"): command = f'pip3 download -i "{self.soft_source}" -d {path} {package} --timeout=100' if version: command += f"=={version}" else: command = f'pip3 download -i "{self.soft_source}" -d {path} -r {os.path.join(base_path, package)}' print(f"download:: command={command}") res = subprocess.run(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE, encoding="utf-8", timeout=100, shell=True) print(res.returncode, res.stdout, res.stderr) return res def install(self, package: str, model: str, version=None): base_path = os.path.join(self.package_pre, model) path = os.path.join(base_path, "package", package) if not os.path.exists(path): raise FileNotFoundError(path) if not package.endswith("txt"): command = f'pip3 install --no-index --ignore-installed --find-links={path} {package}' + "=={version}" if version else "" else: command = f'pip3 install --no-index --ignore-installed --find-links={path} -r {os.path.join(base_path, package)}' print(command) res = subprocess.run(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE, encoding="utf-8", timeout=100, shell=True) if res.returncode == 0: print(f"code={res.returncode}, stdout={res.stdout}, stderr={res.stderr}") return self.check(package) else: print(f"code={res.returncode}, stdout={res.stdout}, stderr={res.stderr}") return 0 @staticmethod def check(package): res = subprocess.run(f"pip3 show {package}", stdout=subprocess.PIPE, stderr=subprocess.PIPE, encoding="utf-8", timeout=10, shell=True) print(res.returncode) if res.returncode == 0: print("res.stdout: {}".format(res.stdout.split('\n'))) return 1 else: return 0 def upgrade_pip(self): res = subprocess.run(f"pip3 install --upgrade pip", stdout=subprocess.PIPE, stderr=subprocess.PIPE, encoding="utf-8", timeout=10, shell=True) @staticmethod def update(stdout: str): if stdout.find("pip install --upgrade pip") != -1: res = subprocess.run(f"python3 -m pip install --upgrade pip", stdout=subprocess.PIPE, stderr=subprocess.PIPE, encoding="utf-8", timeout=10, shell=True) if res.returncode == 0: return 1 @staticmethod def access(): # 检测pip和python是否存在 try: res = subprocess.run(f"pip3 -V", stdout=subprocess.PIPE, stderr=subprocess.PIPE, encoding="utf-8", timeout=10, shell=True) subprocess.run(f"pip3 list >> hahahahahha.txt", stdout=subprocess.PIPE, stderr=subprocess.PIPE, encoding="utf-8", timeout=10, shell=True) except FileNotFoundError as err: print(traceback.format_exc()) pass else: if res.returncode == 0: if res.stdout.find("python 3") != -1: try: res = subprocess.run(f"python3 -V", stdout=subprocess.PIPE, stderr=subprocess.PIPE, encoding="utf-8", timeout=10, shell=True) except FileNotFoundError as err: pass else: if res.returncode == 0: if res.stdout.find('Python 3') != -1: return 1 def __call__(self, package: str, model: str, version=None, cmd="download"): # 检查 pip和 python环境 if self.access(): if cmd == "download": return self.download(package=package, model=model, version=version) else: return self.install(package=package, model=model, version=version) else: print(f"python3 or pip3 环境异常") if __name__ == '__main__': pipe = Pip("../") # pipe(model="demo", package="requests") pipe.download()
-
第三种: 配置代理
- 1.命令行指定
pip install xx --proxy <proxy>
- 2.全局配置
~/.pip/pip.conf[global] timeout = 3000 index-url = https://mirrors.aliyun.com/pypi/simple proxy = xx [install] trusted-host=mirrors.aliyun.com
- 1.命令行指定