雖然我經常會遇到需要寫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,...