gpt4 book ai didi

python - 使用 CLI 与同一环境中的可执行文件从 parquet 读取 DataFrame 时的不同行为

转载 作者:行者123 更新时间:2023-12-04 11:03:05 28 4
gpt4 key购买 nike

请考虑以下程序为Minimal Reproducible Example -MRE :

import pandas as pd
import pyarrow
from pyarrow import parquet

def foo():
print(pyarrow.__file__)
print('version:',pyarrow.cpp_version)
print('-----------------------------------------------------')
df = pd.DataFrame({'A': [1,2,3], 'B':['dummy']*3})
print('Orignal DataFrame:\n', df)
print('-----------------------------------------------------')
_table = pyarrow.Table.from_pandas(df)
parquet.write_table(_table, 'foo')
_table = parquet.read_table('foo', columns=[]) #passing empty list to columns arg
df = _table.to_pandas()
print('After reading from file with columns=[]:\n', df)
print('-----------------------------------------------------')
print('Not passing [] to columns parameter')
_table = parquet.read_table('foo') #Not passing any list
df = _table.to_pandas()
print(df)
print('-----------------------------------------------------')
x = input('press any key to exit: ')

if __name__=='__main__':
foo()
当我从控制台/IDE 运行它时,它会读取 columns=[] 的全部数据:
(env) D:\foo>python foo.py
D:\foo\env\lib\site-packages\pyarrow\__init__.py
version: 3.0.0
-----------------------------------------------------
Orignal DataFrame:
A B
0 1 dummy
1 2 dummy
2 3 dummy
-----------------------------------------------------
After reading from file with columns=[]:
A B
0 1 dummy
1 2 dummy
2 3 dummy
-----------------------------------------------------
Not passing [] to columns parameter
A B
0 1 dummy
1 2 dummy
2 3 dummy
-----------------------------------------------------
press any key to exit:
但是当我从使用 Pyinstaller 创建的可执行文件中运行它时,它不会读取 columns=[] 的数据:
E:\foo\dist\foo\pyarrow\__init__.pyc
version: 3.0.0
-----------------------------------------------------
Orignal DataFrame:
A B
0 1 dummy
1 2 dummy
2 3 dummy
-----------------------------------------------------
After reading from file with columns=[]:
Empty DataFrame
Columns: []
Index: [0, 1, 2]
-----------------------------------------------------
Not passing [] to columns parameter
A B
0 1 dummy
1 2 dummy
2 3 dummy
-----------------------------------------------------
press any key to exit:
如您所见,通过 columns=[]在可执行文件中给出空数据框,但是在直接运行 python 文件时不存在这种行为,我不确定为什么在同一环境中相同的代码会有这两种不同的行为。
查看 parquet.read_table 的文档字符串在 source code at GitHub :

columns: list
If not None, only these columns will be read from the file. A columnname may be a prefix of a nested field, e.g. 'a' will select 'a.b','a.c', and 'a.d.e'.


read_table 进一步调用 dataset.read 调用 _dataset.to_table 返回对 self.scanner 的调用然后返回对静态方法的调用 from_dataset Scanner类(class)。
无处不在, None已被用作 columns 的默认值参数,如果 None[]在python中直接转换为 bool 值,两者确实都是 False , 但如果 []对照 None 检查, 那么它将是 False ,但没有提到它是否应该获取 columns=[] 的所有列因为它的计算结果是 False对于 bool 值,或者它应该根本不读取任何列,因为列表是空的。
但是,为什么从命令行/IDE 运行它时的行为与从使用 Pyinstaller 为相同版本的 Pyarrow 创建的可执行文件运行时不同呢?
我所在的环境:
  • Python 版本:3.7.6
  • Pyinstaller 版本:4.2
  • Pyarrow 版本:3.0.0
  • Windows 10 64 位操作系统

  • 如果您想尝试一下,这里是供您引用的规范文件(您需要更改 pathex 参数):
    foo.spec
    # -*- mode: python ; coding: utf-8 -*-
    import sys ; sys.setrecursionlimit(sys.getrecursionlimit() * 5)
    block_cipher = None


    a = Analysis(['foo.py'],
    pathex=['D:\\foo'],
    binaries=[],
    datas=[],
    hiddenimports=[],
    hookspath=[],
    runtime_hooks=[],
    excludes=[],
    win_no_prefer_redirects=False,
    win_private_assemblies=False,
    cipher=block_cipher,
    noarchive=False)
    pyz = PYZ(a.pure, a.zipped_data,
    cipher=block_cipher)
    exe = EXE(pyz,
    a.scripts,
    [],
    exclude_binaries=True,
    name='foo',
    debug=False,
    bootloader_ignore_signals=False,
    strip=False,
    upx=True,
    console=True )
    coll = COLLECT(exe,
    a.binaries,
    a.zipfiles,
    a.datas,
    strip=False,
    upx=True,
    upx_exclude=[],
    name='foo')

    最佳答案

    感谢 @U12-Forward 帮助我调试问题。
    经过一番研究和调试,并探索了库程序文件,我发现 pyarrow 使用 _ParquetDatasetV2ParquetDataset本质上是两个从 parquet 文件中读取数据的不同函数,_ParquetDatasetV2用作 legacy_mode ,即使这些函数是在 pyarrow.parquet 模块中定义的,它们来自 Dataset pyarrow 的模块,使用 Pyinstaller 创建的可执行文件中缺少该模块。
    当我添加 pyarrow.Dataset作为隐藏的导入并创建了构建,exe 正在提升 ModuleNotFoundError由于 Dataset 使用的几个缺少依赖项而导致执行时模块。为了解决它,我添加了所有 .py从环境到隐藏导入的文件并再次创建构建,最后它起作用了,它起作用了,我的意思是我能够在两种环境中观察到相同的行为。
    修改后的spec修改后的文件如下所示:

    # -*- mode: python ; coding: utf-8 -*-
    import sys ; sys.setrecursionlimit(sys.getrecursionlimit() * 5)
    block_cipher = None


    a = Analysis(['foo.py'],
    pathex=['D:\\foo'],
    binaries=[],
    datas=[],
    hiddenimports=['pyarrow.benchmark', 'pyarrow.cffi', 'pyarrow.compat', 'pyarrow.compute', 'pyarrow.csv', 'pyarrow.cuda', 'pyarrow.dataset', 'pyarrow.feather', 'pyarrow.filesystem', 'pyarrow.flight', 'pyarrow.fs', 'pyarrow.hdfs', 'pyarrow.ipc', 'pyarrow.json', 'pyarrow.jvm', 'pyarrow.orc', 'pyarrow.pandas_compat', 'pyarrow.parquet', 'pyarrow.plasma', 'pyarrow.serialization', 'pyarrow.types', 'pyarrow.util', 'pyarrow._generated_version', 'pyarrow.__init__'],
    hookspath=[],
    runtime_hooks=[],
    excludes=[],
    win_no_prefer_redirects=False,
    win_private_assemblies=False,
    cipher=block_cipher,
    noarchive=False)
    pyz = PYZ(a.pure, a.zipped_data,
    cipher=block_cipher)
    exe = EXE(pyz,
    a.scripts,
    [],
    exclude_binaries=True,
    name='foo',
    debug=False,
    bootloader_ignore_signals=False,
    strip=False,
    upx=True,
    console=True )
    coll = COLLECT(exe,
    a.binaries,
    a.zipfiles,
    a.datas,
    strip=False,
    upx=True,
    upx_exclude=[],
    name='foo')
    此外,为了创建构建,我使用 --paths 包含了虚拟环境的路径。争论:
    pyinstaller --path D:\foo\env\Lib\site-packages foo.spec
    以下是执行上述步骤后的执行:
    E:\foo\dist\foo\pyarrow\__init__.pyc
    version: 3.0.0
    -----------------------------------------------------
    Orignal DataFrame:
    A B
    0 1 dummy
    1 2 dummy
    2 3 dummy
    -----------------------------------------------------
    After reading from file with columns=[]:
    A B
    0 1 dummy
    1 2 dummy
    2 3 dummy
    -----------------------------------------------------
    Not passing [] to columns parameter
    A B
    0 1 dummy
    1 2 dummy
    2 3 dummy
    -----------------------------------------------------
    press any key to exit:
    确实没有提到 columns=[] 的期望行为。 ,但看着 ARROW-13436 opened in pyarrow @Pace,似乎 columns=[] 的期望行为是根本不读取数据列,但它不是官方的构造,所以它可能是pyarrow 3.0.0本身的一个错误。

    关于python - 使用 CLI 与同一环境中的可执行文件从 parquet 读取 DataFrame 时的不同行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68486056/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com