Python apache beam ImportError:数据流工作线程上没有名为 *** 的模块

Xit*_*rum 3 python python-2.7 google-cloud-dataflow apache-beam

摘要:有些本地软件包可以工作,有些则不行

我的梁应用程序的结构:

-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
Run Code Online (Sandbox Code Playgroud)

在main.py中:

from package1 import one
from package2 import two
from package3 import three
Run Code Online (Sandbox Code Playgroud)

在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(),
)
Run Code Online (Sandbox Code Playgroud)

运行时,通过使用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.py”,第 345 行,在 apache_beam.runners.worker.operations.DoOperation.start 中,带有 self.scoped_start_state:文件“apache_beam/runners/worker/operations.py”,第 350 行,在 apache_beam.runners.worker.operations.DoOperation.start pickler.loads(self.spec.serialized_fn)) 文件“/usr/local/lib/python2.7 /dist-packages/apache_beam/internal/pickler.py”,第 244 行,加载中返回 dill.loads(s) 文件“/usr/local/lib/python2.7/dist-packages/dill/_dill.py”,第 316 行,在加载中返回 load(file,ignore) 文件“/usr/local/lib/python2.7/dist-packages/dill/_dill.py”,第 304 行,在加载 obj = pik.load() 文件中“ /usr/lib/python2.7/pickle.py”,第 864 行,在加载调度键文件“/usr/lib/python2.7/pickle.py”中,第 1096 行,在 load_global klass = self.find_class(module, name )文件“/usr/local/lib/python2.7/dist-packages/dill/_dill.py”,第 465 行,在 find_class 中返回 StockUnpickler.find_class(self, module, name) 文件“/usr/lib/python2.7” 7/pickle.py”,第 1130 行,在 find_class import (module) 中导入错误:没有名为三的模块

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

有人有解决这个问题的办法吗?

谢谢。

小智 5

已经过去了快一年了,但我遇到了一个非常相似的问题并且能够解决它,因此为其他偶然发现此页面的人发帖。

就我而言, 没有什么特别的package3.three,它只是恰好是工作人员尝试导入的第一个。事实上,删除package3.three(例如,通过暂时将其内容直接包含在 中main.py)会导致其他模块之一出现相同的错误。

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