hadoop streaming 中跑python程序,自定义模块的导入

今天在做代码重构,以前将所有python文件放到一个文件夹下,上传到hadoop上跑,没有问题;不过随着任务的复杂性增加,感觉这样甚是不合理,于是做了个重构,建了好几个包存放不同功能的python文件,历程如下:

1. 刚开始的时候,在IDE里搞,点击运行,正确、非常赞;

2. 然后搬到服务器上搞,出现了这样的问题:

ImportError: no module named XXX

啊,看样子是包引用中路径不对,于是找文章解决:

  python中,每个py文件被称之为模块,每个具有__init__.py文件的目录被称为包。只要模
块或者包所在的目录在sys.path中,就可以使用import 模块或import 包来使用
如果你要使用的模块(py文件)和当前模块在同一目录,只要import相应的文件名就好,比
如在a.py中使用b.py: 
import b

但是如果要import一个不同目录的文件(例如b.py)该怎么做呢? 
首先需要使用sys.path.append方法将b.py所在目录加入到搜素目录中。然后进行import即
可,例如

import sysimport oscurPath = os.path.abspath(os.path.dirname(__file__))rootPath = os.path.split(curPath)[0]sys.path.append(rootPath)

第一个问题解决,高兴!

3. 而后尝试在hadoop-streaming上跑程序,额,一直在报错:

ImportError: no module named XXX

心想也是因为这个路径问题,试了很多种方法:

  后来在stackoverflow发现有人问了同样的问题,并且我使用其中一个方案解决了:

When Hadoop-Streaming starts the python scripts, your python script‘s path is where the script file really is. However, hadoop starts them at ‘./‘, and your lib.py(it‘s a symlink) is at ‘./‘, too. So, try to add ‘sys.path.append("./")‘ before you import lib.py like this:
import sys
sys.path.append(‘./‘)
import lib当Hadoop-Streaming启动python脚本时,您的python脚本的路径就是脚本文件的实际位置。 然而,hadoop以‘./‘开头,lib.py(它是一个符号链接)也在‘./‘。 因此,在导入lib.py之前,尝试添加“sys.path.append(”./“)”“。 import sys sys.path.append(‘./‘) import lib

并且导入模块和包时,不能用 from XXX import YYY的方式做了,必须要用 import XXX, 使用YYY的时候,要用XXX.YYY来调用;反复尝试终于发现了这点。也算没白费时间吧。

原文地址:https://www.cnblogs.com/wrh526/p/9456558.html

时间: 2024-11-08 22:55:33

hadoop streaming 中跑python程序,自定义模块的导入的相关文章

what's the python之自定义模块和包

模块自定义 上节说了有关模块的知识,当时所说的模块都是内置模块,现在来看自己定制的模块,即模块也可以自定义. 模块的自定义就是指写一段python文件,一般情况下里面包含了可执行的语句和函数的定义,其实自定义的模块和内置模块的效果一样,都是使以后程序的操作更加方便,不用重复敲一样的代码,直接导入模块就可以使用.导入方式与内置模块相同,import+文件名,当然,自定义的模块增加了许多其他的导入方式,下文我们会详细介绍. 需要特别注意的是:我们自定义的模块名不应该与系统内置模块重名. 现在我们来自

Python学习教程(Python学习路线):教你如何在交互式环境中执行Python程序

Python学习教程(Python学习路线):教你如何在交互式环境中执行Python程序 相信接触过Python的伙伴们都知道运行Python脚本程序的方式有多种,目前主要的方式有:交互式环境运行.命令行窗口运行.开发工具上运行等,其中在不同的操作平台上还互不相同.今天,小编讲些Python基础的内容,以Windows下交互式环境为依托,演示Python程序的运行. 一般来说,顺利安装Python之后,有两种方式可以进入Python交互性环境.一种是在Python自带的IDLE中直接打开交互式窗

Python调用自定义模块方法有什么?

Python模块是一个Python文件,以.py结尾,包括了Python对象定义和Python语句,能让Python代码段更有逻辑性.更好用.更易懂,既然Python模块有这么多好处,那么该如何引用Python模块呢? import语句 自定义模块可以采用import语句来进行引入,其操作步骤是先导入模块,再调用模块中包含的函数,可将自定义模块放入当前目录,便于解释器路径搜索,以下是导入自定义hello.py模块,并调用World函数的实例: #!/usr/bin/python # -*- co

python调用自定义模块方法 python培训中心

Python模块是一个Python文件,以.py结尾,包括了Python对象定义和Python语句,能让Python代码段更有逻辑性.更好用.更易懂,既然Python模块有这么多好处,那么该如何引用Python模块呢? import语句 自定义模块可以采用import语句来进行引入,其操作步骤是先导入模块,再调用模块中包含的函数,可将自定义模块放入当前目录,便于解释器路径搜索,以下是导入自定义hello.py模块,并调用World函数的实例: #!/usr/bin/python # -*- co

执行Python程序时模块报错

1. 在执行python程序时遇到 ‘ModuleNotFoundError: No module named 'xxxxx'’ : 例如: 图片中以导入第三方的 'requests' 模块为例,此报错提示找不到requests模块.在python中,有的 模块是内置的(直接导入就能使用)有的模块是第三方的,则需要安装完成后才能导入使用,若未 安装直接导入使用就会出现上述报错!这里介绍最快的解决方法: 1)通过 pip (python软件包工具) 来安装所需要使用的第三方模块: 打开cmd输入

如何在Windows系统中设置Python程序定时运行

文章出处:http://blog.csdn.net/wwy11/article/details/51100432 首先,我们肯定是要用到Windows下的[计划任务]功能 之后点击右侧的[创建基本任务],输入任务名称以及可选的任务描述: 点击下一步,设置任务的开始时间,这个应该没什么难度,我这里设置为每天早上10点运行此计划任务 点击下一步,设置[操作]为[启动程序],再点击下一步,最关键的地方来了,这里该怎么填写才能保证系统正确地运行Python程序呢? 废话不多说,先看具体的设置: 这里解释

Python包和模块的导入问题

模块--代码封装 模块是Python组织代码的基本方式.Python的脚本都是用扩展名为py的文本文件保存,一个脚本可以单独运行,也可以导入另一个脚本中运行,当脚本被导入运行时,我们将其称为模块(module).就是说,我们在python里写的所有代码文件都可以叫模块. 导入的时候,模块名与脚本的文件名相同,例如我们编写了一个名为items.py 的脚本,则在另外一个脚本中用import item语句来导入它. windows环境下在python中查看安装有哪些模块 >>> import

python基础四(模块的导入)

一.导入模块?从模块导入时,一般使用 import sys(用sys模块举例) #这种方式导入模块,要使用这个模块其中的功能,语法为模块名称**.**功能,如print(sys.path) from sys import path #这种方式导入模块要使用模块中的功能,直接功能名即可print(sys),如果要导入该模块多个功能可以以逗号隔开 from SomeMode import * #这种方式和第二种一样只是把具体的功能名换成了*(导入所有),这种方式也有弊端,假如你导入的模块都有一个名为

hadoop 流streaming跑python程序

先放上命令: hadoop jar /usr/hadoop-1.2.1/contrib/streaming/hadoop-streaming-1.2.1.jar -mapper mapper.py -file mapper.py -reduce reduce.py -file reduce.py -file params.txt -file params2.txt -input /data/* -output /output 其中output不存在才可以. mapper.py的输出直接传给red