今天在做代码重构,以前将所有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 sys
import os
curPath = 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来调用;反复尝试终于发现了这点。也算没白费时间吧。

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

  1. 【转】C++中嵌入python程序——参数传递

    C++中嵌入python程序——参数传递 前面两篇博客已经介绍如何在C++中嵌套使用 python,但是在实际使用中,我们需要向python传递各种各样的参数,这样的程序才具有更高的灵活性.下面简单介 ...

  2. Windows系统中设置Python程序定时运行方法

    Windows系统中设置Python程序定时运行方法 一.环境 win7 + Python3.6 二.步骤 1,在Windows开始菜单中搜索“计划任务”,并且点击打开“计划任务”: 2.点击“创建基 ...

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

    模块自定义 上节说了有关模块的知识,当时所说的模块都是内置模块,现在来看自己定制的模块,即模块也可以自定义. 模块的自定义就是指写一段python文件,一般情况下里面包含了可执行的语句和函数的定义,其 ...

  4. python基础--自定义模块、import、from......import......

    自定义模块.import.from......import...... 1)模块的定义和分类 1.模块是什么? 我们知道一个函数封装了一个功能,软件可能是有多个函数组成的.我们说一个函数就是一个功能, ...

  5. Python 模块化 自定义模块 (四)

    自定义模块 一个.py文件就是一个模块 创建以下三个文件: 运行test.py ,查看运行结果. #test.py print("this is test module") imp ...

  6. python程序的模块与包

    python的程序是由模块组成的,一个python文件就是一个模块,而模块一般由代码,函数,或者类组成.创建baiduHq.py模块(文件),在该模块中编写变量,函数,类,来说明在一个模块中,变量的输 ...

  7. 17.python自定义模块的导入方式

    1.直接用import导入 最后运行main.py可以看到命令行窗口输出了一句:你好,这样就完成了. 2.通过sys模块导入自定义模块的路径path 3.在环境变量中找到自定义模块 这个方法原理就是利 ...

  8. 执行Python程序时模块报错

    1. 在执行python程序时遇到 'ModuleNotFoundError: No module named 'xxxxx'' : 例如: 图片中以导入第三方的 'requests' 模块为例,此报 ...

  9. 【python之路2】CMD中执行python程序中文显示乱码

    在IDLE中执行下面代码,中文显示正常: # -*- coding:utf-8 -*- st=raw_input("请输入内容")print st 但在CMD中执行e:\hello ...

随机推荐

  1. 1.搭建Angular2项目

    简述:搭建angular2的开发环境,网上已经有许多教程,不过都是window系统下的教程,我本人使用的是linux系统,搭建环境的过程也稍微比前者麻烦了一点,可参考本人的另一篇文章Linux系统下安 ...

  2. LCD LED OLED区别 以及RGB、YUV和HSV颜色空间模型

    led 液晶本身不发光,而是有背光作为灯源,白色是由红绿蓝三色组成,黑色是,液晶挡住了led灯光穿过显示器. lcd比led更薄. oled:显示黑色时,灯是灭的,所以显示黑色更深,效果更好. 这就不 ...

  3. webRTC中音频相关的netEQ(一):概述

    上篇文章(语音通信中终端上的时延(latency)及减小方法)说从本篇开始会切入webRTC中的netEQ主题,netEQ是webRTC中音频技术方面的两大核心技术之一(另一核心技术是音频的前后处理, ...

  4. mysql通过now()获取的时间不对

    先用now()获取系统时间,发现时间不对(差8个小时): mysql> select now(); +---------------------+ | now() | +------------ ...

  5. Sql更新

    //要传一个DataSet,和若干个表 /// <summary> /// 更新数据库 /// </summary> /// <param name="data ...

  6. 最长重复字符串题解 golang

    最长重复字符串题解 package main import ( "fmt" "strings" ) type Index map[int]int type Co ...

  7. mysql创建表及插入数据操作步骤及注意要点

    环境:mysql workbench 1.创建新的表,注意,指定要存放的数据库 列名可以加单引号(键盘上1左边的引号),也可以不加 2.插入数据 注意:如果数据是字符型,必须使用单引号或者双引号,如: ...

  8. CSS——Flex

    任何一个容器都可以指定为Flexbox布局 .flex-container { display: -webkit-flex; /* Safari */ display: flex; } 行内元素可以指 ...

  9. Problem B: 故障电灯(light)

    考虑对电灯进行差分:若第i个电灯和第i + 1个电灯状态不同,则在第i个位置上放一个球 这样我们就放置了不超过2n个球,且必然是偶数个 于是问题转化为:有m个球,每一步可以把一个球平移奇质数个位置,两 ...

  10. 关于Python课程的一些思考。

    出于对网络爬虫的好奇,我选修了Python程序设计,至于pyhton还能干啥还不太清除,只觉得爬一些数据很有意思,所以希望老师讲一些数据分析之类的技术.学完课程希望能分析一些数据,比如:还有: 上课的 ...