我可以压缩包含一些 setuptools.Extension 的 PySpark 依赖项吗?

Can I zip PySpark dependencies containing some setuptools.Extension?

我正在尝试通过一个简短的小 zip 构建过程 pip install -r requirements.txt -t some_target && cd some_target && zip -r ../deps.zip . && cd .. 为 PySpark (v2.4.3) shell 会话包含 dateparser 包,然后我会,例如,pyspark --py-files deps.zip。但是,当 importing dateparser 时,我从 regex 库中得到一个间接的 ModuleNotFoundError,抱怨“没有名为 'regex._regex' 的模块”(堆栈跟踪说这是在 /mnt/tmp/spark-some/long/path/deps 中引用的.zip/regex/_regex_core.py 第 21 行,它当然被 dateparser 引用到堆栈更远的地方)。

我尝试像 dateparser --no-binary=regex 一样向 requirements.txt 中的 dateparser 行添加一个标志,但错误仍然存​​在。正常的 python shell 可以毫无问题地导入,并且此 zip 中的其他包似乎可以毫无问题地导入 PySpark shell。这让我陷入了许多困境,但我 think/hope 我终于找到了罪魁祸首:即 regex._regex 不是普通的 .py 文件,而是 .so.我对 python 构建过程的了解有限,但似乎正则表达式库的 setup.py uses the setuptools.Extension class to compile some C files into this shared object. I have seen suggestions 修改了 LD_LIBRARY_PATH 环境变量以使这些共享对象可被 python 发现,但是许多评论还表明这是危险的,不是一个可行的长期解决方案。正常的 python 交互式会话与导入没有问题这一事实也让我持怀疑态度,因为 LD_LIBRARY_PATH 变量甚至不存在于该交互式 shell 的 os.environ 中.我因此想知道 --py-files 是否不足以包含编译这些扩展对象的包(似乎不太可能,因为有很多人在做比我的简单用例更疯狂的事情),或者这是否实际上源于忽视一些其他设置。

感谢所有帮助:)

错误似乎源于导入语句无法识别 zip 存档中的二进制 (.so) 文件,即我通过 --py-files 参数传递的 dependencies.zip。我首先尝试拉出正则表达式依赖项并构建一个 .whl 以包含在 --py-files 中,以发现我的 PySpark (v2.4.3) 版本早于 wheel 支持。但是,我能够基于源代码构建一个 .egg,然后为 spark.executorEnv 和 spark.driverEnv 设置 PYTHON_EGG_CACHE 和 PYTHON_EGG_DIR env 变量...不确定最后一步对其他人是否有必要;它似乎源于奇怪的权限问题,这些问题可能只适用于我的 user/group/use 案例。