- 適用於 JDK 23 的 GraalVM (最新)
- 適用於 JDK 24 的 GraalVM (搶先體驗)
- 適用於 JDK 21 的 GraalVM
- 適用於 JDK 17 的 GraalVM
- 封存
- 開發版本
Python 嵌入的權限
Python 腳本的存取控制和安全性限制 #
將 GraalPy 嵌入 Java 的方式與 GraalVM 多語沙箱 搭配運作。
Python 的 POSIX 介面 #
作業系統介面如何暴露給 Python 腳本是 GraalPy 特有的。預設情況下,所有存取都會透過 Java 介面進行路由,但某些套件依賴 POSIX API 的詳細資訊,並需要直接的原生存取。
Graal 語言 (在 Truffle 框架 上實作的語言) 通常使用 Truffle 抽象層 來實作系統相關的功能,該抽象層與 OS 無關,並在將 GraalPy 或其他 Graal 語言嵌入 Java 應用程式時為使用者提供擴充點。 例如,請參閱 Truffle FileSystem 服務供應商。
標準 Python 程式庫也提供 OS 抽象化,但會暴露較低層級的介面。 例如,os
模組直接暴露某些 POSIX 函數。 在非 POSIX 平台上,此介面在某種程度上會被模擬。
GraalPy 提供兩種替代實作 (每個都稱為「後端」),用於提供內建 Python 模組 (例如 os
) 所提供的系統相關功能。 PosixModuleBackend
選項決定使用哪個後端:有效值為 native
和 java
。
原生後端 #
此後端以與 CPython (參考 Python 實作) 大致相同的方式直接呼叫 POSIX API。
此方法最能與 CPython 相容,並提供對底層 OS 介面的原始存取,而無需中間模擬層。
預設情況下,此實作會繞過 Truffle 抽象層,因此它未經過沙箱處理,並且不支援 Truffle FileSystem 服務供應商 的自訂實作,以及與系統介面相關的其他 Polyglot API 供應商。
當透過 graalpy
或任何其他 Python 相關的啟動器啟動 GraalPy 時,會預設選取原生後端。例外情況是僅在 Oracle GraalVM 中可用的具有 -managed
後綴的 Python 相關啟動器 (例如,graalpy-managed
),這些啟動器預設使用 java
POSIX 後端。
原生後端的限制
已知的限制為
- 不支援
os.fork
_posixsubprocess.fork_exec
不支援preexec_fn
參數
Java 後端 #
此後端使用 Truffle 抽象層,因此支援與系統介面和沙箱處理相關的自訂 Polyglot API 供應商。 因為此抽象化與 POSIX 無關,因此它不會暴露所有必要的功能。 某些功能會被模擬,而某些功能則不受支援。
當透過 Context
API 執行 GraalPy (即 嵌入 Java 應用程式) 時,或使用具有 -managed
後綴的 Python 相關啟動器 (僅在 Oracle GraalVM 中可用) 啟動時,Java 後端是預設值。
Java 後端的限制
GraalPy 可以記錄有關在執行階段執行的函數的已知不相容性的資訊,其中包括與 OS 介面相關的函數。 若要開啟此記錄,請使用命令列選項 --log.python.compatibility.level=FINE
(或其他所需的記錄層級)。
Java 後端的已知限制為
- 它的狀態與實際的 OS 狀態斷開連接,這尤其適用於
- 檔案描述元:Python 層級的檔案描述元無法在原生程式碼中使用。
- 目前工作目錄:會在啟動時初始化為目前工作目錄,但隨後會單獨維護。 因此,例如,Python 中的
chdir
不會變更處理序的實際目前工作目錄。 - umask:具有與目前工作目錄相同的限制,但它始終初始化為
0022
,無論啟動時的實際系統值為何。
- 檔案存取/修改時間的解析度取決於 JDK。Java 後端可以保證的最佳解析度是秒。
os.access
和任何其他基於faccessat
POSIX 函數的功能都不支援- 有效 ID。
follow_symlinks=False
,除非模式僅為F_OK
。
Python 原生擴充功能 #
Python 原生擴充功能預設以原生二進位檔執行,並具有對底層系統的完整存取權。 請參閱 嵌入限制
執行原生擴充功能所需的內容權限為
.allowIO(IOAccess.ALL)
.allowCreateThread(true)
.allowNativeAccess(true)