1. 程式人生 > >hadoop streaming 中跑python程序,自定義模塊的導入

hadoop streaming 中跑python程序,自定義模塊的導入

stack 題解 pat add 程序 oot erro them 問題解決

今天在做代碼重構,以前將所有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程序,自定義模塊的導入