繁体   English   中英

Python Apache Beam ImportError:数据流工作者上没有名为***的模块

[英]Python apache beam ImportError: No module named *** on dataflow worker

摘要:一些本地软件包有效,而有些则无效

我的梁应用程序的结构:

-setup.py

-app/__init__.py
-app/main.py

-package1/__init__.py
-package1/one.py

-package2/__init__.py
-package2/two.py

-package3/__init__.py
-package3/three.py

在main.py中:

from package1 import one
from package2 import two
from package3 import three

在setup.py中

import setuptools

setuptools.setup(
    name='beam',
    version='1.0',
    install_requires=['apache-beam[gcp]',
                      'google-cloud==0.34.0',
                      'google-cloud-bigquery==0.25.0',
                      'requests==2.19.1',
                      'google-cloud-storage==1.12.0'
                      ],
    packages=setuptools.find_packages(),
)

运行时,通过使用python -m app.main

使用直接运行器(本地运行),没问题。

使用DataflowRunner(发送到gogole数据流),我遇到此错误:

apache_beam.runners.dataflow.dataflow_runner.DataflowRuntimeException:数据流管道失败。 状态:失败,错误:回溯(最近一次调用最近):文件“ /usr/local/lib/python2.7/dist-packages/dataflow_worker/batchworker.py”,行642,在do_work work_executor.execute()文件中/usr/local/lib/python2.7/dist-packages/dataflow_worker/executor.py“,行156,在执行op.start()中,文件“ apache_beam / runners / worker / operations.py”,行344,在apache_beam中.runners.worker.operations.DoOperation.start def start(self):在apache_beam.runners.worker.operations.DoOperation.start中以“ self.scoped_start_state”开头的文件“ apache_beam / runners / worker / operations.py”第345行:File apache_beam.runners.worker.operations.DoOperation.start pickler.loads(self.spec.serialized_fn))文件“ /usr/local/lib/python2.7”中的第350行,“ apache_beam / runners / worker / operations.py” /dist-packages/apache_beam/internal/pickler.py“,第244行,在负载中返回dill.loads文件” /usr/local/lib/python2.7/dist-packages/dill/_dill.py“,第316行,在加载中返回load(file,ignore)File“ /usr/local/lib/python2.7/dist-packages/di 负载obj = pik.load()中第304行的“ ll / _dill.py”行,负载分配密钥文件“ / usr / lib / python2”中的行“ /usr/lib/python2.7/pickle.py”文件中的行ll / _dill.py”。 7 / pickle.py“,第1096行,在load_global klass = self.find_class(模块,名称)文件“ /usr/local/lib/python2.7/dist-packages/dill/_dill.py”,第465行,在find_class返回StockUnpickler.find_class(自身,模块,名称),在find_class 导入 (模块)中的文件“ /usr/lib/python2.7/pickle.py”,行1130 ImportError:没有名为三个模块

这有点“令人沮丧”,因为我加倍/三倍/ ...检查这些软件包之间的区别是什么,并且它们是相同的。 Sane __init__.py文件(空,其中没有奇怪或隐藏的字符)。 *.py的结构类型相同。 但是由于某种原因,包装3只是不想合作。

有人对此问题有解决方案吗?

谢谢。

已经快一年了,但是我遇到了一个非常相似的问题,并且能够解决它,因此将其他人绊脚石张贴到此页面上。

在我的情况下, package3.three没有什么特别的,它恰好是工作人员尝试导入的第一个。 实际上,删除package3.three (例如,通过将其内容直接直接包含在main.py )会导致其他模块之一发生相同的错误。

虽然我不完全了解根本原因,但使用文件调用python app/main.py而不是模块调用python -m app.main解决此问题。 我猜测setup.py的包装与模块调用中的隐式包装之间存在一些冲突。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM