小编yyk*_*yyk的帖子

如何轻松分发具有Python模块依赖性的Python软件?Unix上的Python包安装令人沮丧

我的目标是分发一个Python包,其中包含其他几个广泛使用的Python包作为依赖项.我的包依赖于编写良好的Pypi索引包,如pandas,scipy和numpy,并在setup.py中指定需要某些版本或更高版本,例如"numpy> = 1.5".

我发现,对于那些不是 Python打包专家的Unix精明用户(即使他们知道如何编写Python)来安装像我这样的软件包,即使在使用易于使用的软件包管理器时,我也感到非常沮丧和几乎不可能.我想知道是否有一个替代这个痛苦的过程,有人可以提供,或者如果我的经验只是反映了Python包装和分发的当前状态非常困难.

假设用户将您的包下载到他们的系统上.大多数人会试图"天真地"安装它,使用类似的东西:

$ python setup.py install
Run Code Online (Sandbox Code Playgroud)

因为如果你有关于安装Python软件包的google说明,通常会出现这种情况.这对绝大多数用户来说都是失败的,因为大多数用户的Unix/Linux服务器上没有超级用户访问权限.通过更多搜索,他们将发现"--prefix"选项并尝试:

$ python setup.py install --prefix=/some/local/dir
Run Code Online (Sandbox Code Playgroud)

由于用户不知道Python包装的复杂性,他们会选择一个任意目录作为参数--prefix,例如"~/software/mypackage/".它不会是所有其他Python包所在的干净策划目录,因为大多数用户都不知道这些细节.如果他们安装另一个包"myotherpackage",他们可能会通过它"~/software/myotherpackage",你可以想象这将导致令人沮丧的黑客攻击PYTHONPATH和其他并发症.

继续安装过程,一旦用户尝试使用该包,调用"setup.py install"with "--prefix"也将失败,即使它似乎已正确安装,因为其中一个依赖项可能会丢失(例如pandas,scipy或numpy)和一个包经理没有使用.他们会尝试单独安装这些软件包.即使成功,包也将不可避免地PYTHONPATH归因于给出的非标准目录,"--prefix"并且患者用户将涉及修改它们PYTHONPATH以使得依赖性可见.

在这个阶段,Python精明的朋友可能会告诉用户他们应该使用像"easy_install"主流管理器这样的软件包管理器来安装软件并且需要处理依赖项.安装后"easy_install",这可能很难,他们会尝试:

$ easy_install setup.py 
Run Code Online (Sandbox Code Playgroud)

这也将失败,因为用户通常无权在生产Unix服务器上全局安装软件.通过阅读更多,他们将了解该"--user"选项,并尝试:

$ easy_install setup.py --user 
Run Code Online (Sandbox Code Playgroud)

他们会得到错误:

usage: easy_install [options] requirement_or_url ...
   or: easy_install --help

error: option --user not recognized
Run Code Online (Sandbox Code Playgroud)

他们将非常困惑为什么他们easy_install没有--user选项,因为网上有明确的网页描述选项.他们可能会尝试将其升级easy_install到最新版本并发现它仍然失败.

如果他们继续并咨询Python包装专家,他们会发现有两个版本,两个版本easy_install都被命名为" …

python pip package-managers setuptools distribute

58
推荐指数
2
解决办法
9705
查看次数

如何加快PyMC马尔可夫模型?

有没有办法加快这个简单的PyMC模型?在20-40个数据点上,需要约5-11秒才能适应.

import pymc
import time
import numpy as np
from collections import OrderedDict

# prior probability of rain
p_rain = 0.5
variables = OrderedDict()
# rain observations
data = [True, True, True, True, True,
        False, False, False, False, False]*4
num_steps = len(data)
p_rain_given_rain = 0.9
p_rain_given_norain = 0.2
p_umbrella_given_rain = 0.8
p_umbrella_given_norain = 0.3
for n in range(num_steps):
    if n == 0:
        # Rain node at time t = 0
        rain = pymc.Bernoulli("rain_%d" %(n), p_rain)
    else:
        rain_trans = \
          pymc.Lambda("rain_trans", …
Run Code Online (Sandbox Code Playgroud)

python pymc pymc3

12
推荐指数
1
解决办法
762
查看次数

标签 统计

python ×2

distribute ×1

package-managers ×1

pip ×1

pymc ×1

pymc3 ×1

setuptools ×1