2016-04-20 74 views
1

我想導入與numpy打包的zip文件。python導入錯誤與郵編

我已經壓縮成packages.zip numpy。但是,在使用zip文件時,我收到以下導入錯誤。

> python 
Python 2.7.9 (default, Jan 7 2015, 11:49:12) 
[GCC 4.2.1 Compatible Apple LLVM 6.0 (clang-600.0.56)] on darwin 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import sys 
>>> sys.path.insert(0, 'packages.zip') 
>>> import numpy 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "packages.zip/numpy/__init__.py", line 180, in <module> 
    File "packages.zip/numpy/add_newdocs.py", line 13, in <module> 
    File "packages.zip/numpy/lib/__init__.py", line 8, in <module> 
    File "packages.zip/numpy/lib/type_check.py", line 11, in <module> 
    File "packages.zip/numpy/core/__init__.py", line 14, in <module> 
ImportError: cannot import name multiarray 
>>> 

檢查numpy的/核心我發現__init__.py後試圖導入multiarray.so文件。

如何解決此錯誤?謝謝

+0

你是如何構建.zip文件的?操作系統不會從.zip文件中讀取'.so'文件,因此您不能只壓縮numpy目錄。 Setuptools有一個'bdist_egg'命令,通過生成存根.py文件來處理庫,這些文件將.so文件提取到操作系統可以使用它們的磁盤。 – tdelaney

+0

'pip install -r requirements.txt --target。/ packages' 'cd packages' 'find。 -name「* .pyc」-delete「查找。 -name「* .egg-info」| xargs rm -rf' 'zip -9mrv packages.zip' – Vinay

+0

@tdelaney你能詳細解釋一下嗎?我需要在map-reduce環境中使用此zip。 – Vinay

回答

0

操作系統無法識別.zip文件中的.so文件。但是python「eggs」可以在導入時提取擴展模塊,以便操作系統可以查看並加載它們。有關詳細信息,請參閱setuptools Extension Import Wrappers。我去了numpy on pypi,發現它的source on sourceforge。在下載和解壓縮源代碼之後,我將其更改爲源目錄並運行python3 setup.py bdist_egg並生成了一個「egg」文件(這是一個帶有預定義結構的Python文件,可在導入時使用.zip文件)。更改爲「DIST」目錄後,代碼工作:

>>> import sys 
>>> sys.path.insert(0, 'numpy-1.11.0-py3.4-linux-x86_64.egg') 
>>> import numpy 
>>> numpy.__file__ 
'numpy-1.11.0-py3.4-linux-x86_64.egg/numpy/__init__.py' 

注意,「蛋」是平臺特定的(我在Linux上使用x86_64的蟒蛇3.4),所以你要接近一個系統上運行setup.py您部署的目標系統。

「雞蛋」是舊的包裝格式,「wheel」是新的格式,但雞蛋的優點是可以直接從.zip文件運行擴展模塊,而需要安裝輪子。來自Wheel vs Egg頁面:

車輪是分佈格式,即打包格式。 [1] Egg既是分發格式又是運行時安裝格式(如果保留了壓縮格式),並且被設計爲可導入的。

如果你不介意安裝numpy,您可以使用PyPI上的預建的車輪中的一個,甚至只是pip install numpy如果你有機會到互聯網。但是,如果你想從.zip文件運行,堅持使用雞蛋。