繁體中文
English 简体中文 繁體中文
Methodox 首頁

Python

Divooka Compute 附帶 SteelPython,即 Methodox 的 Python 3.12,以 spy.exe 的形式位於其資料夾中。在 SteelPython 中,Divooka 的包、工作負載和文件可以像任何 Python 模組一樣匯入:不需要 import clr,不需要 AddReference,電腦上也不需要安裝 Python。SteelPython 本身執行在 .NET 上,因此包中的型別就是 Python 類,文件中的圖就是 Python 函式。反過來也同樣可行:你自己的 Python 程式碼可以變成節點,編輯器本身也可以用 Python 來驅動。

import Divooka.Workloads.AudioProcessing as audio      # a package
import Statistics                                     # Statistics.dvk, beside this script
import divooka

tone = audio.AudioGenerators.Tone(440, 0.5)           # a node is a function of its type
print(audio.AudioAnalysis.Duration(tone))             # 0.5

print(Statistics.Mean([3, 4, 8]))                     # a Function graph of the document
Statistics.Run()                                      # its entry graph, run whole

啟動

  • 在編輯器中:按 Ctrl+Shift+` 開啟停靠欄的 Terminal 標籤頁,按一下 + 並選擇 SteelPython。Python 提示符會在包含目前文件的工作區資料夾中啟動;輸入 exit() 即可退出。請參閱視窗。
  • 在任意終端會話中(無論使用哪種 shell),以及在 Divooka Compute 資料夾中的任意命令列中,都可以直接按名稱使用 spy。它就是 SteelPython 自己的命令列,並新增了 Divooka 的匯入功能:
要執行的操作 寫法
執行指令碼 spy script.py
執行一行程式碼 spy -c "print(1 + 1)"
執行模組 spy -m module
輸入 Python 並檢視每條結果 spy

在提示符下輸入 help(divooka),可列出可以匯入的內容及匯入方法。

匯入名稱

要取得 寫法 示例
包 按發行版給出的名稱 import import Divooka.Workloads.AudioProcessing as audio
包,按 Divooka Compute 中顯示的名稱 divooka.package(name) divooka.package("Audio Processing")
工作負載:它列出的所有包 divooka.workload(id or name) divooka.workload("audio-processing")
指令碼旁邊的文件 按檔名 import 對於 Statistics.dvk,寫 import Statistics
任意位置的文件 divooka.document(path) divooka.document("Examples/Basics/Hello World.dvk")
此發行版附帶的內容 divooka.packages()、divooka.workloads()

與 Python 一貫的規則一樣,你 import 的名稱必須完全一致:要寫 Divooka.Workloads.AudioProcessing,而不是 divooka.workloads.audioprocessing;import Statistics 也找不到 statistics.dvk。divooka.package 和 divooka.workload 接受名稱的方式與 Pure 的 Import(...) 相同:程式集名稱、id 或顯示名稱均可,不區分大小寫。

包

包的模組中包含其節點所屬的型別(節點是這些型別的方法),以及這些節點接受和返回的型別:from Divooka.Workloads.AudioProcessing import AudioGenerators, Waveform。節點是其所屬型別的函式,例如 AudioGenerators.Tone(440, 1) 就是 Tone 節點。這是因為同一個包中的兩個型別可能各有一個同名節點,由型別來區分它們。

  • 實參的轉換方式與任何 .NET 方法相同:數字、文字、True 和 False,列表對應陣列和列表,字典對應字典,關鍵字實參按參數名傳入。節點的結果就是節點返回的物件,你可以將它傳給下一個節點,或通過它的成員讀取內容。
  • 包名開頭的各段(Divooka、Divooka.Workloads)也是模組,因此可以先 import Divooka,再使用 Divooka.Workloads.AudioProcessing.AudioGenerators。
  • 匯入第一個包需要幾秒鐘,因為此時要載入發行版的各個包;之後的每次匯入都是即時的。

工作負載

divooka.workload("audio-processing")(或 "Audio Processing")會給出一個模組,其中包含該工作負載所列出的每個包中的所有名稱,包模組本身則位於 __packages__ 中。工作負載是基於它建立的文件所引用的一組起始包,這裡得到的正是同一組包。

文件

文件是一個模組,其函式就是它的圖:文件中的每個 Function、Routine 和 Constructs 圖各對應一個函式,名稱與 Divooka Compute 中的名稱相同,按順序或按名稱接受圖的輸入,並帶有圖所宣告的預設值。Run(*arguments) 以執行文件的方式執行文件的入口圖。

import divooka
hello = divooka.document("Examples/Basics/Hello World.dvk")
hello.Run()
help(hello)          # its graphs and what they take
  • 按名稱:import Statistics 會在 import 搜尋的資料夾中(首先是指令碼所在的資料夾)依次尋找 Statistics.dvk 和 Statistics.dvj,因此指令碼可以和它的文件放在一起使用。檔名中帶空格的文件需要用 divooka.document 匯入。
  • 按路徑:divooka.document(path) 依次在指令碼旁邊、工作資料夾和 Divooka Compute 的資料夾中尋找;如果名稱沒有副檔名,會自動新增 .dvk 或 .dvj。請求兩次會得到同一個模組。
  • 你自己的模組優先:如果 Statistics.dvk 旁邊有 Statistics.py,import Statistics 得到的是後者。
  • 修改了文件? 使用 importlib.reload(Statistics),或者對 divooka.document 返回的模組使用 divooka.reload(module),即可重新讀取它。
  • 首次匯入文件時會構建其程式,需要片刻時間;之後的呼叫都很快。
  • 文件列印的內容會輸出到主控台,位於指令碼在呼叫之前列印的內容之後。

將你的 Python 程式碼用作節點

反過來:在文件中將你自己的 Python 指令碼或 Python 的模組用作節點。

  • 指令碼。 在大綱的 References 下,按一下 Add reference…,按一下 Script,然後選擇一個 .py 檔案。指令碼頂層的每個函式都會成為以其名稱命名的節點(bed_area 會成為 Bed Area),名稱以底線開頭的函式除外。
  • 模組。 在同一張卡片上按一下 Python,從已安裝的模組或標準庫中選擇一個模組,或者在卡片的輸入框中輸入 py: 加模組名:py:statistics、py:numpy.linalg。模組中的每個公共函式都會成為節點。

指令碼怎麼寫,節點就是什麼樣:

def bed_area(width: float, length: float = 2.0) -> float:
    """The area of a rectangular bed, in square metres.

    Args:
        width: How wide the bed is, in metres.
        length: How long it is, in metres.
    """
    return width * length
  • 輸入就是參數,型別由註解決定:float 是 Number,int 是整數,str 是文字,bool 是真值,list[float] 是 Number 列表,dict[str, float] 是字典,pandas.DataFrame 是 Table。沒有註解的參數接受任何內容,有預設值的參數可以不連線。
  • 輸出是函式的返回值,型別由返回註解決定;-> None 表示節點沒有輸出。
  • 說明來自文件字串,其中的 Args:(或 NumPy 風格的 Parameters,或 :param x:)說明每個輸入的用途。
  • 儲存指令碼後,所有引用它的已開啟文件中的對應節點都會重新生成。指令碼在頂層執行的操作(例如讀取檔案或構建模型)只執行一次,指令碼更改後會再次執行。
  • 函式列印的內容會顯示在文件的主控台中。
  • Table 傳給函式時,如果安裝了 pandas,會是 pandas DataFrame,否則是由列組成的字典。函式返回的 DataFrame 會轉換回 Table。
  • 凡是能執行文件的地方,它都能執行: 解釋和編譯模式下均可,在編輯器中和使用 stew 時均可。釋出會構建一個自帶 Python 的程式:包括你的指令碼、Python 標準庫,以及指令碼匯入的 pandas 和 numpy。這樣的程式總是以自包含方式構建,從不使用 Native AOT。
  • pandas 和 numpy 隨 Standard 版 Divooka Compute 一起安裝:在指令碼、Immediate 標籤頁和 spy 中都可以 import pandas,並且在 Add reference 卡片上按一下 Python 時,它們會顯示為已安裝。

New from examples 中有一個 Python 類別,展示了上述所有功能的實際用法:Script Reference、Module Reference 和 Pandas Tables。

在編輯器中

Divooka Compute 的視窗在三個地方執行 Python:

位置 用途 執行方式
Immediate 標籤頁 針對目前文件逐條嘗試程式碼 在編輯器內部
Automate Editor 修改已開啟文件的指令碼 在編輯器內部
Run 獨立執行的指令碼,與在終端中執行一樣 在單獨的程序中

在編輯器內部,Immediate 標籤頁、Automate Editor 和 Python 節點共用同一個 Python。每個文件有自己的名稱空間,因此在 Immediate 標籤頁中定義的函式只有該文件的 Python 節點能看到,其他文件看不到。模組是共享的。

Immediate 標籤頁

Shift+F4 會開啟停靠欄並顯示 Immediate 標籤頁,其中有一個 >>> 提示符。預設語言是 Python,該標籤頁的下拉選單中也提供 C#。Editor、Document、Graph 和 Selection 都在作用域中,分別表示應用程式、目前文件、其畫布上的圖,以及其中的所選內容。

>>> len(Graph.Nodes)
3
>>> added = Graph.AddNode("Add", 700, 150, True)
>>> added.MoveTo(800, 300)
>>> Graph.FindNode("Print Line").Input("Message").Value
'Hello from Console.dvk'
>>> import Divooka.Standard.PlatformBase as base
>>> base.NumberRoutines.Multiply(6, 7)
42.0

每項更改都通過編輯器自身的命令進行,因此一條輸入在它所更改的每個文件中都是一個復原步驟,在畫布上按 Ctrl+Z 即可復原。失敗或被停止的輸入會被整體復原。

按鍵 作用
Enter 執行輸入。Python 程式碼塊在最後一行留空後執行。
Shift+Enter 在輸入中換行
Ctrl+Enter 執行輸入,無論是否已寫完
Up Down 之前執行過的輸入
Tab 補全名稱
Ctrl+C 在下一行處停止輸入。如果輸入阻塞在一個不返回的呼叫中,三秒後會被放棄。

input() 從同一行讀取。如果文件所在的工作區選擇了環境,輸入可以匯入該環境中的包,匯入的內容在之後會被丟棄,與指令碼的情況相同。

執行指令碼

目前是 .py 檔案時,按 F5 或按一下 Run,會像在終端中一樣執行它:在檔案所在的資料夾中、在單獨的程序中執行 spy Script.py。它列印的內容會輸出到停靠欄的主控台,input() 從主控台的輸入行讀取,Shift+F5 可停止執行。無論指令碼做什麼,崩潰、死迴圈或退出都只限於它自己的程序,Stop 始終有效。

按一下某行左側的邊欄即可設定斷點,按 F5 執行時會在那裡停止:右側面板中顯示 Locals 和 Call stack,F10 單步跳過,F11 單步進入,Shift+F11 單步跳出,F5 繼續,Shift+F5 停止。C# 和 Lua 檔案的用法相同。請參閱除錯。

Automate Editor

目前是 .py 檔案時,工具列上的 Automate Editor 會在編輯器內部執行它,並可存取已開啟的文件:

graph = Editor.ActiveDocument.EntryGraph
begin = graph.FindNode("Begin")
printed = begin.InsertAfter("Print Line")
printed.Input("Message").Value = "from Python"

一次執行是一個復原步驟,失敗的執行會被復原,斷點在這裡同樣有效。DivookaCompute.exe 旁邊的 Editor Automation 資料夾中附帶了幾個示例:GridLayout、PrintAfterSelection 和 RunFolder,每個都有 C#、Lua 和 Python 版本。

Python 環境和 pip

目前是 .py 檔案時,工具列上的包按鈕會開啟 Python environment,指令碼可以在這裡獲得自己的包:

  • 選擇指令碼或其工作區資料夾使用的環境。指令碼自己的選擇優先,按鈕上會顯示指令碼執行時所用環境的名稱。
  • + New environment 使用 spy -m venv 建立一個環境,自帶 pip,無需聯網,位於 %LOCALAPPDATA%\DivookaCompute\Python\environments 下。它只是一個啟動器和幾個檔案,而不是 Divooka Compute 的 Python 的副本。
  • Install 接受名稱、需求說明或 wheel 檔案的路徑,由環境自己的 pip 進行安裝。已安裝的包列在其下方,你安裝的包旁有一個叉號,用於將其移除。
  • Delete environment 會刪除該環境及其中安裝的所有內容。

Run、Automate Editor,以及(對於該工作區中的文件)Immediate 標籤頁都會使用該環境。spy 和 pip 列印的內容會輸出到停靠欄中的 Python 標籤頁。

純 Python 的包可以直接匯入。帶有編譯部分的包(例如 numpy 和 pandas)則通過 SteelPython 的相容庫載入,即 DivookaCompute.exe 旁邊的 python312.dll 和 python3.dll,每個版本都帶有它們:它們代替了這些編譯部分原本要呼叫的 CPython。它可以載入為 Windows 上的 CPython 3.12 構建的 wheel;SteelPython 會針對這類流行包(其中包括 scikit-learn 和 PyTorch)進行測評,將它們的結果與 CPython 的結果進行比較。numpy 和 pandas 隨 Divooka Compute 一起提供。你自己安裝的包優先於附帶的包。

從 pythonnet 遷移

這裡的一切都不需要 import clr、clr.AddReference 或安裝 CPython,也不會在兩個執行時之間複製任何內容:Python 中的 Divooka 物件就是該物件本身。為 pythonnet 編寫的程式碼中的 import clr 仍然可用,但使用 Divooka 的名稱從不需要它。

另請參閱

  • Divooka SDK - 用程式碼基於 Divooka 進行構建:庫、命令列工具和各種接入方式。
  • 引用 - 文件使用的內容,以及如何新增指令碼或模組。
  • 除錯 - 斷點和單步執行。
  • Pure - Divooka 的 C# 指令碼編寫工具,以相同的方式匯入包和文件。