我一直在尝试使用Yosemite和全新安装的ActiveState Python 3.4在MacBook Pro上安装numpy,pysci等。我已经尝试了很多车轮文件,它们都失败了“这个平台上没有支持的车轮”。例如,从https://pypi.python.org/pypi/numpy使用最新的Python 3.4轮文件:
...$ sudo pip3 install numpy-1.9.1-cp34-cp34m-macosx_10_6_intel.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl
numpy-1.9.1-cp34-cp34m-macosx_10_6_intel.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl is not a supported wheel on this platform.
我通过wheel.py,req.py和pep425tags.py追踪我,试图了解失败的原因。 在pep425tags.py中,它使用
distutils.util.get_platform().replace('.', '_').replace('-', '_')
然后,可能会将与轮文件的文件名中的标签进行比较。
由于我已升级到Yosemite,我原本期望我的计算机会返回类似“macosx_10_10_intel”或“macosx_10_10_x86_64”的内容 - 而是返回“macosx_10_6_x86_64”
>>> import distutils.util
>>> distutils.util.get_platform().replace('.', '_').replace('-', '_')
'macosx_10_6_x86_64'
>>>
我是否认为Yosemite显然是在报道它是Snow Leopard?或者Python 3.4出错了?这是轮盘文件的问题吗?如果有,是否有修复?
更新到Python 3.4.2纠正了问题,我能够安装numpy wheel文件。 但请注意,distutils.util.get_platform()仍会报告“macosx_10_6_intel”,但这不会影响安装。
Python 3.4.2 (v3.4.2:ab2c023a9432, Oct 5 2014, 20:42:22)
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin
Type "copyright", "credits" or "license()" for more information.
>>> import distutils.util
>>> distutils.util.get_platform().replace('.', '_').replace('-', '_')
'macosx_10_6_intel'
答案 0 :(得分:4)
考虑distutils.util.get_platform()
返回运行二进制文件的最小版本:
对于Mac OS X系统,操作系统版本反映了最低版本 二进制文件将运行(即
MACOSX_DEPLOYMENT_TARGET
的值 在Python的构建过程中,不是当前系统的操作系统版本。
强调我的。也就是说,对于Python 3.4,如果你在该平台上构建Python,你可以合理地期望该值为10.10。
要让Python处理MACOSX_DEPLOYMENT_TARGET
以便在整个过程中正常工作,您需要升级到Python 3.4.2; 3.4.1尚未准备好用于Mac OS X 10.10或更高版本。请参阅问题#21811:
cpython代码库中有许多地方可以根据正在运行的系统版本或OS X ABI(例如MACOSX_DEPLOYMENT_TARGET的值)进行决策,该解释器是使用或正在构建解释器的。大多数当前测试都会对这些值进行字符串比较,这些值与两位数的版本号无关(' 10.10'<
'> True) 。
3.4.2包含所需的修复程序。这同样适用于Python 2.7至版本2.7.7;如果你在Python 2.7中看到同样的问题升级到2.7.8或更高版本。
如果没有修复,intel
与x86_64
混在一起,就像您的设置一样:
- 在10.10上运行当前的3.4.1和2.7.7二进制安装程序时,构建C扩展模块可能会导致通用平台名称不正确,例如" x86_64"而不是" intel",这可能会影响扩展模块文件名和轮子或蛋名称。
醇>
作为参考,在我的OS X 10.10系统上,在Python 3.4.2上get_platform()
的结果是:
>>> import distutils.util
>>> distutils.util.get_platform()
'macosx-10.10-x86_64'
对于Python 2.7.8我得到:
>>> import distutils.util
>>> distutils.util.get_platform()
'macosx-10.4-x86_64'