Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/297.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 无法使用PyInstaller可执行文件导入Geopandas-尽管在虚拟环境中运行良好_Python_Pyinstaller_Geopandas - Fatal编程技术网

Python 无法使用PyInstaller可执行文件导入Geopandas-尽管在虚拟环境中运行良好

Python 无法使用PyInstaller可执行文件导入Geopandas-尽管在虚拟环境中运行良好,python,pyinstaller,geopandas,Python,Pyinstaller,Geopandas,当我用PyInstaller冻结的Python应用程序尝试导入Geopandas时,它停止工作 视窗10 PyInstaller 3.3.1 Geopandas 0.4 以下是源代码: print("Hello, StackOverflow") import geopandas as gpd 以下是编译的EXE的结果控制台输出: Hello, StackOverflow Traceback (most recent call last): File "application.py",

当我用PyInstaller冻结的Python应用程序尝试导入Geopandas时,它停止工作

  • 视窗10
  • PyInstaller 3.3.1
  • Geopandas 0.4
以下是源代码:

print("Hello, StackOverflow")
import geopandas as gpd
以下是编译的EXE的结果控制台输出:

Hello, StackOverflow
Traceback (most recent call last):
  File "application.py", line 3, in <module>
  File "<frozen importlib._bootstrap>", line 971, in _find_and_load
  File "<frozen importlib._bootstrap>", line 955, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 665, in _load_unlocked
  File "d:\documents\projecttwo\publish\harv_venv1\env\lib\site-packages\PyInstaller\loader\pyimod03_importers.py", line 631, in exec_module
    exec(bytecode, module.__dict__)
  File "site-packages\geopandas\__init__.py", line 9, in <module>
  File "<frozen importlib._bootstrap>", line 971, in _find_and_load
  File "<frozen importlib._bootstrap>", line 955, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 665, in _load_unlocked
  File "d:\documents\projecttwo\publish\harv_venv1\env\lib\site-packages\PyInstaller\loader\pyimod03_importers.py", line 631, in exec_module
    exec(bytecode, module.__dict__)
  File "site-packages\geopandas\datasets\__init__.py", line 7, in <module>
StopIteration
[6764] Failed to execute script application
你好,StackOverflow 回溯(最近一次呼叫最后一次): 文件“application.py”,第3行,在 文件“”,第971行,在_find_和_load中 文件“”,第955行,在“查找”和“加载”中解锁 文件“”,第665行,在“加载”中 exec_模块中的文件“d:\documents\projecttwo\publish\harv_venv1\env\lib\site packages\PyInstaller\loader\pyimod03_importers.py”,第631行 exec(字节码、模块、指令) 文件“site packages\geopandas\\uuuu init\uuuuu.py”,第9行,在 文件“”,第971行,在_find_和_load中 文件“”,第955行,在“查找”和“加载”中解锁 文件“”,第665行,在“加载”中 exec_模块中的文件“d:\documents\projecttwo\publish\harv_venv1\env\lib\site packages\PyInstaller\loader\pyimod03_importers.py”,第631行 exec(字节码、模块、指令) 文件“site packages\geopandas\datasets\\uuuu init\uuuuu.py”,第7行,在 停止迭代 [6764]无法执行脚本应用程序 当我尝试导入Geopandas时,这种行为是一致的,因为Geopandas是更复杂的应用程序,并且控制台输出是恒定的

Geopandas正确安装在Python 3.6.3虚拟环境中(通过PIP,我也尝试了0.4和0.3版本),在编译之前工作正常(即
Python application.py
成功运行)

我尝试从不同的来源安装geopandas和pyinstaller(例如Gohlke的轮子),结果相同。我还试着从头开始创建一个全新的虚拟EnV,从Gohlke安装菲奥娜和PIP的Geopand。p>
我怀疑可能需要进行一些隐藏的导入。我是PyInstaller的新手,因此非常感谢您的帮助。

看起来
geopandas
正在init上积极加载他们的数据目录。它包含被包中的
pyinstaller
忽略的非python文件,因此要在加载时找到
geopandas
,必须显式打包这些文件

“手动”过程花了我一段时间才弄明白,我正在使用
conda
作为我的包管理器(如果您没有,这些编辑应该仍然可以帮助您)。要使其正常工作,我们需要修改第一次运行
pyinstaller
时生成的
.spec
文件:

# -*- mode: python -*-

import os
from PyInstaller.utils.hooks import collect_data_files # this is very helpful
env_path = os.environ['CONDA_PREFIX']
dlls = os.path.join(env_path, 'DLLs')
bins = os.path.join(env_path, 'Library', 'bin')

paths = [
    os.getcwd(),
    env_path,
    dlls,
    bins,
]

# these binary paths might be different on your installation. 
# modify as needed. 
# caveat emptor
binaries = [
    (os.path.join(bins,'geos.dll'), ''),
    (os.path.join(bins,'geos_c.dll'), ''),
    (os.path.join(bins,'spatialindex_c-64.dll'), ''),
    (os.path.join(bins,'spatialindex-64.dll'),''),
]

hidden_imports = [
    'ctypes',
    'ctypes.util',
    'fiona',
    'gdal',
    'geos',
    'shapely',
    'shapely.geometry',
    'pyproj',
    'rtree',
    'geopandas.datasets',
    'pytest',
    'pandas._libs.tslibs.timedeltas',
]

# other fancy pyinstaller stuff...

a = Analysis(['run_it.py'],
         pathex=paths, # add all your paths
         binaries=binaries, # add the dlls you may need
         datas=collect_data_files('geopandas', subdir='datasets'), #this is the important bit for your particular error message
         hiddenimports=hidden_imports, # double tap
         hookspath=[],
         runtime_hooks=[],
         excludes=excludes,
         win_no_prefer_redirects=False,
         win_private_assemblies=False,
         cipher=block_cipher)
# remaining fancy pyinstaller stuff...
这将收集丢失的数据目录,并将其放在可执行文件可以找到的地方

“自动”方法是构建一个为您执行此操作的
hook geopandas.py
文件
pyinstaller
在构建时加载这些挂钩,作为保存和共享这些技巧的一种方式。事实上,
shapely
已经有了一个非常好的钩子文件,
geopandas
依赖项之一,您可以查看它

------编辑--------

我目前正在建设一个依赖于
geopandas
的项目,因此我意识到,截至目前(2018-08-23),上述修复不完整

在我的run_it.py中,我包括了以下测试,以确保
fiona
gdal
都正确打包到包中:

from osgeo import gdal, ogr, osr
from fiona.ogrext import Iterator, ItemsIterator, KeysIterator
from geopandas import GeoDataFrame
除非您是向导,否则此测试可能会失败。此垫片在.spec文件中对我有效:

_osgeo_pyds = collect_data_files('osgeo', include_py_files=True)

osgeo_pyds = []
for p, lib in _osgeo_pyds:
    if '.pyd' in p:
        osgeo_pyds.append((p, ''))

binaries = osgeo_pyds + [
    # your other binaries
]

a = Analysis(
    # include your kwargs
)

我希望这有助于使这个答案更加完整,并且您的捆绑应用程序能够像预期的那样完成地理空间方面的工作。

我收到了相同的错误,并以与上面的aorr不同的方式解决了它

导致此错误的原因是pyinstaller找不到包中包含的geopandas数据集,因为它们是.shp文件

我在项目中不使用geopandas数据集,因此我没有手动将它们包含在.spec文件中,而是在第9行注释掉了
导入geopandas.datasets
语句:
文件“site packages\geopandas\\ uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu init.py”


这是正确编译的,并为我的程序提供了预期的输出。

Nice!编辑环境路径后,已测试工作。必须删除
geopandas.datasets
的隐藏导入(实际上完全删除了
geopandas.datasets
,因为它抛出了一个错误)。@Joska我很高兴它能为您工作!我刚刚用垫片编辑了另一个在我的项目中咬我的bug。祝你好运我尝试用上面的代码扩展我的规范文件,但现在我得到了以下错误:
文件“c:\programdata\anaconda2\envs\wps\u env36\lib\site packages\PyInstaller\dependen\analysis.py”,第5行54,在get_co_using_ctypes r_ident=r.identifier AttributeError中:“NoneType”对象没有属性“identifier”
这是一个非常有效的解决方案,我还有一个额外的建议,供将来必须更改已安装软件包源的用户参考。从github克隆软件包并安装:
git Clone;光盘pip install-e.
现在,开发人员可以在不损害其站点软件包完整性的情况下更改软件包源代码而不受惩罚。还值得一提的是包和环境管理器(conda/virtualenv/pipenv)。这使得以后可以返回到项目并使用相同的包版本重新构建它。