Python Egg库文件引用同一包中的其他文件

时间:2018-11-29 18:57:37

标签: python python-3.x databricks azure-databricks

我已经创建了一个python egg文件,以将我的许多python模块导入Azure databricks群集。

该软件包中的某些文件引用了同一软件包中的其他文件。本地安装,一切正常。 当我将程序包加载到Azure数据块中并尝试使用导入的库时,出现模块导入错误。

例如: module1看起来像这样

import module2

print('hello, this is module 1')

模块2看起来像这样

print('hello, this is module 2')

注意,模块1导入模块2。 Module2不导入任何内容。

我尝试将module1导入工作区py文件中,当我运行该单元格时,出现错误'ImportError:没有名为'module2'的模块

在数据砖中的笔记本上,运行以下代码:from myLibrary import module1

我收到一个错误:ImportError: No module named 'module2'

如果我运行此命令:from myLibrary import module2

运行正常

我确认egg包中包含module2。 我将所有减去Azure数据块的示例都上传到了github GitHub Sample 这是使用python3运行时运行的。

请让我知道是否需要更多信息来理解该问题,我们很乐意编辑并提供该问题。

2 个答案:

答案 0 :(得分:1)

我怀疑这是pythonpath问题(并且您正在作为Python Job执行)。在module1中,我要添加:

spark = SparkSession.builder.getOrCreate()
spark.sparkContext.addPyFile("dbfs:/path/module2.py")

这将使文件所在的所有节点都

您可以引用包含很多脚本的zip文件而不是py文件,只需确保它们位于zip文件内的平面单个文件夹结构中即可。

答案 1 :(得分:0)

我知道了。西蒙,你的回答不对,但是投票赞成,因为这让我思考了真正的问题是什么。

答案是我的大脑狭窄。 引用原始问题中的示例,我的库中有两个python模块,分别为module1和module2

module2看起来像这样:

print('Hi, I'm module 2')

module1看起来像这样:

import module2
print('Hi, I'm module 1')

如果将module1导入py文件,则应该看到以下内容:

嗨,我是模块2

嗨,我是模块1

现在,回头看作为module1的代码。具体来说,请注意我的进口声明。那就是问题所在。我的新py文件没有module2,并且python解释器显然没有默认在同一个模块内查找(如果要这样做,请告诉我。我在文档中找不到)< / p>

无论如何,正确的导入语句应该是from MyLibrary import module2 我确认已上传到databricks,然后将相同的更改应用于我的实际项目,并且一切正常。