python中自定义模块导入飘红_hadoop streaming 中跑python程序,自定义模块的导入
今天在做代碼重構(gòu),以前將所有python文件放到一個(gè)文件夾下,上傳到hadoop上跑,沒(méi)有問(wèn)題;不過(guò)隨著任務(wù)的復(fù)雜性增加,感覺(jué)這樣甚是不合理,于是做了個(gè)重構(gòu),建了好幾個(gè)包存放不同功能的python文件,歷程如下:
1. 剛開(kāi)始的時(shí)候,在IDE里搞,點(diǎn)擊運(yùn)行,正確、非常贊;
2. 然后搬到服務(wù)器上搞,出現(xiàn)了這樣的問(wèn)題:
ImportError: no module named XXX
啊,看樣子是包引用中路徑不對(duì),于是找文章解決:
python中,每個(gè)py文件被稱之為模塊,每個(gè)具有__init__.py文件的目錄被稱為包。只要模
塊或者包所在的目錄在sys.path中,就可以使用import 模塊或import 包來(lái)使用
如果你要使用的模塊(py文件)和當(dāng)前模塊在同一目錄,只要import相應(yīng)的文件名就好,比
如在a.py中使用b.py:
import b
但是如果要import一個(gè)不同目錄的文件(例如b.py)該怎么做呢?
首先需要使用sys.path.append方法將b.py所在目錄加入到搜素目錄中。然后進(jìn)行import即
可,例如
import sys
import os
curPath = os.path.abspath(os.path.dirname(__file__))
rootPath = os.path.split(curPath)[0]
sys.path.append(rootPath)
第一個(gè)問(wèn)題解決,高興!
3. 而后嘗試在hadoop-streaming上跑程序,額,一直在報(bào)錯(cuò):
ImportError: no module named XXX
心想也是因?yàn)檫@個(gè)路徑問(wèn)題,試了很多種方法:
后來(lái)在stackoverflow發(fā)現(xiàn)有人問(wèn)了同樣的問(wèn)題,并且我使用其中一個(gè)方案解決了:
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
當(dāng)Hadoop-Streaming啟動(dòng)python腳本時(shí),您的python腳本的路徑就是腳本文件的實(shí)際位置。 然而,hadoop以‘./‘開(kāi)頭,lib.py(它是一個(gè)符號(hào)鏈接)也在‘./‘。 因此,在導(dǎo)入lib.py之前,嘗試添加“sys.path.append(”./“)”“。?import sys sys.path.append(‘./‘) import lib
并且導(dǎo)入模塊和包時(shí),不能用 from XXX import YYY的方式做了,必須要用 import XXX, 使用YYY的時(shí)候,要用XXX.YYY來(lái)調(diào)用;反復(fù)嘗試終于發(fā)現(xiàn)了這點(diǎn)。也算沒(méi)白費(fèi)時(shí)間吧。
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的python中自定义模块导入飘红_hadoop streaming 中跑python程序,自定义模块的导入的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: oppok9功能介绍
- 下一篇: 11小时 python自动化测试从入门到