觀察Python環境中的模組

2021-10-25 01:55:38 字數 3133 閱讀 7521

雖然我經常會遇到需要寫python指令碼的情況,但是大多是在某個環境中,比如houdini或者ue4等,所寫的大多是一小段邏輯。因此,對於那些牽扯到多個python檔案的較大型的python專案,我還沒有經驗。這導致目前我對python裡「模組」這個概念有很多不了解之處。

目前,我所最關注的問題是——當我在houdini或者ue4中執行python時:

我想這些問題並不複雜,不過我還是準備結合文件和實踐嘗試搞明白這些問題。

我從《5. 匯入系統 — python 3.9.0 文件》中獲得了關於「模組」的一些概念:

官方文件裡有對模組的搜尋機制進行描述,但感覺描述比較複雜,我沒能完全理解。。。

在《python 模組 | 菜鳥教程》中,有乙個對搜尋路徑的描述:

使用sys.path可以看到所有會搜尋的路徑,並且其中有一定的優先順序:

當前目錄

shell 變數 pythonpath 下的每個目錄。

預設路徑。unix下,預設路徑一般為/usr/local/lib/python/。

我嘗試在我所感興趣的三個環境中使用sys.path看結果是什麼:

houdini裡:

ue4裡:

1. 如何確定乙個模組是否載入了?

以「xml」這個模組為例,嘗試將這個模組print

print(xml)
如何沒有載入,則會顯示錯誤:

traceback (most recent call last):

file "", line 1, in

nameerror: name 'xml' is not defined

>

2. 如何判斷乙個模組是否能找到

簡單來說,只要import命令失敗,就說明找不到。

>>

>

import testtest

traceback (most recent call last):

file "", line 1, in

modulenotfounderror: no module named 'testtest'

而為何找不到,就需要看看模組檔案是否有在上一部分所說的「搜尋路徑」中了。

3. 如何知道模組的**

依舊是print模組的做法。

「xml」模組看來是來自於乙個

>>

> print(xml)

>

「inlinecpp」模組看來是來自於乙個.pyc檔案:

>>

> print(inlinecpp)

linecpp.pyc'

>

「math」模組看來並非來自於檔案:

>>

> print(math)

(built-in)

>

4. 如何新增新的模組

較為直白的是直接將模組檔案放到「搜尋路徑」中。

我的yaksue.py

def

yaksuefunc()

:print

("hello yaksue"

)

在之前已經知道了在houdini中執行python時會搜尋到的路徑,因此我將yaksue.py放入其中乙個目錄。

便可以成功在houdini的python環境中使用了:

如果想使用自己指定的路徑,也可以修改sys.path的值,它是可寫的。

例如,將檔案放入「d:/temp」資料夾中,然後將此路徑加入sys.path

"d:/temp"

)即可在使用自己路徑中的模組了

(不用擔心會汙染「sys.path」,經測試這個修改sys.path的操作是一次性的)

如果在ue4中使用print(unreal),將會得到

(built-in)

>

此模組並非源於某個檔案。

檢視ue4的python外掛程式**會發現,在「unreal」這個模組是由c++**負責新增的:

pyunrealmodule = fpyobjectptr::

newreference

(pyimport_addmodule

("unreal"))

;

關於ue4如何向其中新增具體的內容,還有待研究,我想一定和ue4自己的反射機制離不開。

如果在houdini中使用print(hou),將會得到:

>

會發現它是由乙個編譯好的python檔案提供。它是編譯好的二進位制,沒法閱讀,但是在同級目錄可以找到乙個hou.py,我想應該是由它編譯的。

但在hou.py中並沒有實際函式的實現(或者說實際實現被注釋掉了),最後實際是呼叫了_hou模組的函式。

在同級目錄發現另乙個檔案_hou.pyd

查資料發現.pyd是非python語言編譯好的模組。

關於如何生成.pyd檔案還值得研究。

Python中的模組

我們之前看到了函式和物件。從本質上來說,它們都是為了更好的組織已經有的程式,以方便重複利用。模組 module 也是為了同樣的目的。在python中,乙個.py檔案就構成乙個模組。通過模組,你可以呼叫其它檔案中的程式。我們先寫乙個first.py檔案,內容如下 def laugh print hah...

python中的實用模組 python中的常用模組

python中常用的模組 time 1 time.localtime secs 將乙個時間戳轉換為當前時區的struct time。secs引數未提供,則以當前時間為準。2 time.gmtime secs 和localtime 方法類似,gmtime 方法是將乙個時間戳轉換為utc時區 0時區 的...

python內建模組中的time模組

time時間模組 import time t time.time 獲取當前的utc時間 t time.asctime 將時間元組轉換為日期時間字串 不傳引數返回當前的時間 t time.gmtime 用給定秒數轉換為用utc表達的時間元組 預設返回當前時間元組 t time.mktime 2018,...