首页 > 解决方案 > 如果通过本地文件夹中的循环安装 python 包,则会出错

问题描述

我正在尝试使用循环通过 python 代码安装一些包,但一次只有一个包得到 install

在下一个包中出现以下错误。

Could not install packages due to an EnvironmentError: [Errno 2] No such file or directory: 'c:\\users\\akshay~1.sha\\appdata\\local\\temp\\pip-req-tracker-aoybzz\\f37aad13bd20c8b1e66a004a7c01edf203f7e46ba784c9954fe935f7'

如果我再次运行脚本,它将安装第二个包并为第三个包抛出错误。如果我第三次运行它会安装第三次,我想一次性安装所有的包,请帮忙。下面是代码

==================================================== ==========================

import os

from pip._internal import main as pipmain

PACKAGES = {'pymongo': 'pymongo-3.4.0', 'pexpect': 'pexpect-4.6.0', 'pathlib': 'pathlib-1.0.1'}

def install_dependency(pkg_name, crnt_path):
    pkg_path = os.path.join(crnt_path, "dependencies\\"+pkg_name+"\\")
    print("Installing package from local...", pkg_name)
    pipmain(["install", pkg_path])

def check_dependecies():
    current_path = os.path.dirname(os.path.abspath(__file__))
    print(PACKAGES.keys())
    for package_name in PACKAGES.keys():
        try:
            __import__(package_name, globals=globals())
            print("================> Package imported successfully", package_name)
        except ImportError as import_error:
            print("Package not present", import_error)
            install_dependency(PACKAGES[package_name], current_path)
            print("================> Package imported successfully", package_name)
            __import__(package_name, globals=globals())

if __name__ == "__main__":
    check_dependecies()

标签: pythonpython-2.7pippython-importlib

解决方案


我遇到了同样的问题,我已经使用解决方法解决了这个问题。

我们知道我们不能使用 pip 在 for 循环中安装多个包,但我们也知道我们可以一次安装多个包!

我就是这样进行的:

  1. 循环通过我们的包寻找它们的存在,如果没有,我们将它们保存在一个字典中{pkg_name: pkg_id}(例如{'pymongo': 'pymongo-3.4.0'}:)
  2. 创建pkg2install仅由pkg_id(例如['pymongo-3.4.0', 'pexpect-4.6.0']:)组成的列表
  3. 用于pipmain一次性安装它们:`pipmain(['install', *pkg2install])

您的代码已审核:

from pip._internal import main as pipmain

PACKAGES = {'pymongo': 'pymongo', 'pexpect': 'pexpect', 'pathlib': 'pathlib'}


def check_dependecies():
    missing_pkgs = {}

    for package_name in PACKAGES.keys():
        try:
            __import__(package_name, globals=globals())
            print("================> Package imported successfully", package_name)

        except ImportError as import_error:
            print("Package not present", import_error)

            missing_pkgs.update({package_name: PACKAGES[package_name]})

    pkgs2install = missing_pkgs.values()

    status = pipmain(["install", *pkgs2install])

    if status == 0:
        print("================> Missing packages installed successfully", pkgs2install)    

        for pkg in missing_pkgs.keys():
            __import__(pkg, globals=globals())
            print("================> Package imported successfully", pkg)


if __name__ == "__main__":
    check_dependecies()

它生成的输出:

Package not present No module named 'pymongo'
Package not present No module named 'pexpect'
================> Package imported successfully pathlib
Collecting pymongo
  Downloading https://files.pythonhosted.org/packages/a3/8c/ec46f4aa95515989711a7893e64c30f9d33c58eaccc01f8f37c4513739a2/pymongo-3.9.0-cp37-cp37m-macosx_10_6_intel.whl (378kB)
    100% |████████████████████████████████| 378kB 4.4MB/s 
Collecting pexpect
  Using cached https://files.pythonhosted.org/packages/0e/3e/377007e3f36ec42f1b84ec322ee12141a9e10d808312e5738f52f80a232c/pexpect-4.7.0-py2.py3-none-any.whl
Collecting ptyprocess>=0.5 (from pexpect)
  Using cached https://files.pythonhosted.org/packages/d1/29/605c2cc68a9992d18dada28206eeada56ea4bd07a239669da41674648b6f/ptyprocess-0.6.0-py2.py3-none-any.whl
Installing collected packages: pymongo, ptyprocess, pexpect
Successfully installed pexpect-4.7.0 ptyprocess-0.6.0 pymongo-3.9.0
================> Missing packages installed successfully dict_values(['pymongo', 'pexpect'])
================> Package imported successfully pymongo
================> Package imported successfully pexpect

注意:我没有使用版本或本地包,但机制应该保持不变

尽管晚了 11 个月,但我希望这对您有所帮助。


推荐阅读