我正在尝试解决python软件包PySpark的问题。我开发了一个具有以下结构的python程序包。
sample_package/
|-config/
|-sample.ini
|-main.py
|-__init__.py
在我的main.py
内,有一个代码段,它从config/
目录中读取配置文件,如下所示:
import ConfigParser, os
def sample_func():
config = ConfigParser.ConfigParser()
configfile = os.path.join(os.path.dirname(__file__), 'config', 'sample.ini')
config.read(configfile)
return config.sections()
我为上述软件包创建了一个sample_package.zip
的zip文件,并将该zip文件作为pyspark依赖项
addPyFile(path/to/zip/file)
在我的pyspark作业中,当我导入sample_package
时,导入工作正常,并且可以在main内部调用sample_func
,但是我的python包无法读取{{1} }文件。当在普通的python程序中执行时,它可以正常工作,但在pyspark作业中却不能。在访问静态文件时,在pyspark环境中是否进行了任何路径操作?如何获取我的python软件包以正确读取配置文件?
答案 0 :(得分:0)
我自己找出答案。更多的是python打包问题,而不是pyspark环境问题。看来我不得不使用pkgutil
模块来引用我的静态资源,这修改了我的功能,如下所示:
import ConfigParser, os, pkgutil, StringIO
def sample_func():
config = ConfigParser.ConfigParser()
configfile = pkgutil.get_data('sample_package', 'config/sample.ini')
cf_buf = StringIO.StringIO(configfile)
config.readfp(cf_buf)
return config.sections()
答案 1 :(得分:0)
更简单的版本:
from configparser import ConfigParser
import pkgutil
def sample_func():
config = ConfigParser()
# os.path.join is not needed.
config_data = pkgutil.get_data(__name__, 'config/sample.ini').decode()
config.read_string(config_data)
return config.sections()