【问题标题】:importing python packages with python使用 python 导入 python 包
【发布时间】:2016-04-24 10:10:31
【问题描述】:

所以我希望能够更有弹性地编写我的代码,从我正在考虑解决导入问题的 python 顶部开始。

我希望代码在尚未安装所需软件包的系统上运行。为了实现这一点,我希望在运行时使用 python 安装包。

try:
    import pygame as pg
except(ImportError):
    # [install pygame][1] here
    # Download and run pygame.MSI (windows)
    # apt-get install python-pygame

install pygame 从这个特定的解决方案中,我打算制作一个更通用功能 ...

import subprocess as sp
def imp(inP,name,location):
    try:
        exec "import "+inP+" as "+(name if name != "" else "")
    except ImportError:
        try:
            os = ????
            if(os == windows):
                sp.call("pip install "+location,shell=True)
            if(os == unix):
                sp.call("sudo apt-get install python-"+inP,shell=True)
            r = True
        except Exception:
            print colPrt("ERROR installing ") + inP
            r = False
        try:
            exec "import "+inP+" as "+(name if name != "" else "")
        except(ImportError):
            print colPrt("ERROR importing ") + inP
            r = False
    return r

所以我的一个问题变成了 2。第一个是在运行中安装模块的最佳实践,第二个是 unix 和 windows 环境之间的区别。

Ps,colPrt 只是将红色文本返回到终端

def colPrt(s):
    return("\x1B["+"31;40m" + str(s) + "\x1B[" + "0m")

感谢您的想法:)

【问题讨论】:

  • FWIW,我相信 except (ImportError e) 语法不正确。 . .
  • 考虑使用python wheels 安装您的软件。如果您将依赖项放在轮子中,它们将在安装软件时安装。这样做的好处是用户将为您执行安装所需的任何权限提升。

标签: python cmd pip apt-get


【解决方案1】:

第一个是在运行中安装模块的最佳实践

出于以下几个原因,我建议不要在运行中安装模块:

  1. 用户应该可以选择是否要安装东西。大多数用户对在运行时做出选择不感兴趣(而且您的程序不应该以安装此类东西所需的权限运行)...
  2. 跟进第一点——安装包时应安装依赖项。
  3. 它会使您的代码中出现一堆您真的不想维护的东西。
  4. 即使你包含它,谁说你的代码和网络上某些第三方包的最新版本兼容?

Python 的标准构建系统具有与依赖项交互的方式,因此当您的包被下载和安装时(例如,通过 easy_installpip),依赖项都应该随之而来。

查看here 获取有关如何打包 Python 代码的一些建议。

【讨论】:

  • 当我们这样做的时候,如果你打算做这种蠢事,你至少应该使用importlib.import_module()而不是exec
【解决方案2】:

尝试查看pip-accel,它是pip 的包装器,可以跨平台工作。如果你的用户没有预装python环境,我想推荐你看virtualenv。 Pip + virtualenv 就像一个魅力,你只需要编写一个简短的 python 脚本来运行它。

无论如何,如果您使用自己的解决方案,将很难支持,也许有一天您的老板会来要求您添加 Mac Os 支持。最好在 pip+virtualenv 上编写包装器,而不是自己实现所有逻辑。

【讨论】:

    【解决方案3】:

    对于异常只写出错误信息并让用户选择安装模块。或者在 setup (install) wrapper 中编写它。

    在 unix / linux 平台上,python 是通过 easy_install 分发的,不要尝试在后台使用 apt-get 进行任何安装。没有权限就不会成功。没必要。

    而且我们不仅使用基于 Debian 的 linux :) 例如。我的标准操作系统是基于 unix 的:QNX :)

    【讨论】:

      猜你喜欢
      • 2017-07-01
      • 2020-11-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-30
      • 2013-04-21
      • 1970-01-01
      相关资源
      最近更新 更多