在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問(wèn)答/Python/ python如何跨目錄讀取非.py文件?

python如何跨目錄讀取非.py文件?

如圖,我在test_case目錄的轉(zhuǎn)智能通知存款.py里想使用/common/newConf文件,

但是導(dǎo)入common包以后,只能看到login.py文件,看不到newConf,這里是需要怎么調(diào)用呢?

clipboard.png

回答
編輯回答
巷尾

import關(guān)鍵字是用于導(dǎo)入py模塊的,想讀取newConf文件,直接使用with open語(yǔ)句打開(kāi)該文件,文件路徑建議使用相對(duì)路徑。

2017年8月10日 15:59
編輯回答
大濕胸

可使用readline()強(qiáng)力讀取

2017年9月12日 07:23
編輯回答
奧特蛋

導(dǎo)入包只會(huì)針對(duì)包中的py文件(識(shí)別為模塊)進(jìn)行聯(lián)想顯示,而這里最簡(jiǎn)單暴力的方式是sys.append("absolute_path"), 然后read該非py文件

2017年8月31日 19:16
編輯回答
九年囚

導(dǎo)入系統(tǒng)
要使用模塊和庫(kù),需要先進(jìn)行導(dǎo)入。

導(dǎo)入系統(tǒng)是相當(dāng)復(fù)雜的,不過(guò)你可能已經(jīng)了解了一些基本知識(shí)。這里會(huì)介紹一些關(guān)于這一子系統(tǒng)的內(nèi)部機(jī)理。
sys模塊包含許多關(guān)于Python導(dǎo)入系統(tǒng)的信息。首先,當(dāng)前可導(dǎo)入的模塊列表都是通過(guò)sys.moudle變量才可以使用的。它是一個(gè)字典,其中鍵(key)是模塊名字,對(duì)應(yīng)的值(value)是模塊對(duì)象。

 sys.modules['os']  
<module 'os' from '/usr/lib/python2.7/os.pyc'>

許多模塊是內(nèi)置的,這些內(nèi)置的模塊在sys.builtin_module_names中列出。內(nèi)置模塊可以根據(jù)傳入Python構(gòu)建系統(tǒng)的編譯選項(xiàng)的不同而變化。
導(dǎo)入模塊時(shí),Python會(huì)依賴一個(gè)路徑列表。這個(gè)列表存儲(chǔ)在sys.path變量中,并且告訴Python去哪里搜索要加載的模塊。可以在代碼中修改這個(gè)列表,根據(jù)需要添加或刪除路徑,也可以通過(guò)編寫Python代碼直接修改環(huán)境變量PYTHONPATH。下面的方法幾乎是相等的1。

>>> import sys  
>>> sys.path.append('/foo/bar')

$ PYTHONPATH=/foo/bar python  
>>> import sys  
>>> '/foo/bar' in sys.path  
True

在sys.path中順序很重要,因?yàn)樾枰闅v這個(gè)列表來(lái)尋找請(qǐng)求的模塊。
也可以通過(guò)自定義的導(dǎo)入器(importer)對(duì)導(dǎo)入機(jī)制進(jìn)行擴(kuò)展。Hy2正是利用的這種技術(shù)告訴Python如何導(dǎo)入其他非標(biāo)準(zhǔn)的.py或者.pyc文件的。
顧名思義,導(dǎo)入鉤子機(jī)制是由PEP 302(http://www.python.org/dev/pep...)定義的3。它允許擴(kuò)展標(biāo)準(zhǔn)的導(dǎo)入機(jī)制,并對(duì)其進(jìn)行預(yù)處理,也可以通過(guò)追加一個(gè)工廠類到sys.path_hooks來(lái)添加自定義的模塊查找器(finder)。
模塊查找器對(duì)象必須有一個(gè)返回加載器對(duì)象的find_module(fullname, path=None)方法,這個(gè)加載器對(duì)象必須包含一個(gè)負(fù)責(zé)從源文件中加載模塊的load_module(fullname)方法。
為了進(jìn)一步說(shuō)明,下面給出了Hy利用自定義的導(dǎo)入器導(dǎo)入.hy而不是.py結(jié)尾的源文件的方法,見(jiàn)示例2.1。
示例 Hy模塊導(dǎo)入器
class MetaImporter(object):

def find_on_path(self, fullname):  
    fls = ["%s/__init__.hy", "%s.hy"]  
    dirpath = "/".join(fullname.split("."))  

    for pth in sys.path:  
        pth = os.path.abspath(pth)  
        for fp in fls:  
            composed_path = fp % ("%s/%s" % (pth, dirpath))  
            if os.path.exists(composed_path):  
                return composed_path  

def find_module(self, fullname, path=None):  
    path = self.find_on_path(fullname)  
    if path:  
        return MetaLoader(path)  

sys.meta_path.append(MetaImporter())
一旦路徑被確定是有效的且指向了一個(gè)模塊,就會(huì)返回一個(gè)MetaLoader對(duì)象。
Hy模塊加載器
class MetaLoader(object):

def __init__(self, path):  
    self.path = path  

def is_package(self, fullname):  
    dirpath = "/".join(fullname.split("."))  
    for pth in sys.path:  
        pth = os.path.abspath(pth)  
        composed_path = "%s/%s/__init__.hy" % (pth, dirpath)  
        if os.path.exists(composed_path):  
            return True  
    return False  

def load_module(self, fullname):  
    if fullname in sys.modules:  
        return sys.modules[fullname]  

    if not self.path:  
        return  

    sys.modules[fullname] = None  
    mod = import_file_to_module(fullname, self.path) 

    ispkg = self.is_package(fullname)  

    mod.__file__ = self.path  
    mod.__loader__ = self  
    mod.__name__ = fullname  

    if ispkg:  
        mod.__path__ = []  
        mod.__package__ = fullname  
    else:  
        mod.__package__ = fullname.rpartition('.')[0]  

    sys.modules[fullname] = mod  
    return mod

import_file_to_module讀取一個(gè)Hy源文件,將其編譯成Python代碼,并返回一個(gè)Python模塊對(duì)象。
uprefix模塊(https://pypi.python.org/pypi/...)是這個(gè)功能起作用的另一個(gè)好的例子。Python 3.0到3.2并沒(méi)有像Python 2中用來(lái)表示Unicode字符串的u前綴4,這個(gè)模塊通過(guò)在編譯前刪除字符串的前綴u 來(lái)確保在2.x和3.x之間的兼容性。


摘自書中,希望對(duì)你有幫助

2018年7月6日 09:44