2014-01-06 62 views
7

是否可以在沒有標準庫的情況下嵌入python?是否可以在沒有標準庫的情況下嵌入python?

我與一個cmake build for python 2.7.6工作,我得跑,像這樣一個基本的嵌入腳本:

#include <stdio.h> 
#include <Python.h> 

int main(int argc, char *argv[]) { 

    /* Setup */ 
    Py_SetProgramName(argv[0]); 
    Py_Initialize(); 

    /* Run the 'main' module */ 
    int rtn = Py_Main(argc, _argv); 
    Py_Finalize(); 

    return rtn; 
} 

..但是當我運行它,我得到:

ImportError: No module named site 

如果我設置了正確的$ PYTHONHOME,它可以正常工作;但這不是我想要做的。我試圖在沒有標準庫的獨立應用程序中嵌入python的副本。我很喜歡它的使用,但是對於這個特定的嵌入式環境,我想要更像lua的東西(但是顯然是使用python語法),其中只有父應用程序公開的特定庫可用。

這還有一個額外的好處,就是不用關心分佈(或構建)標準庫及其所有交叉鏈接的動態庫。

這是可能的嗎?或者我不可避免地會陷入像sys.path,import,{},[]或其他類似語言的缺失基本塊,這些是標準庫的一部分?

如果可能的話,你會怎麼做呢?

+2

爲什麼不提供自己最小的'標準庫'?只包括'site.py',任何'site.py'都需要運行,以及你的應用程序需要什麼? –

+2

但是,是的,CPython實現確實需要某些模塊存在且可導入。在Python 3中,包括導入機器。 'sys'是一個內置模塊,語法永遠不會被導入,而是語言的一部分,所以'{}'和'[]'不會中斷。 –

+0

我正在考慮這個問題,但是發佈一個二進制文件有點煩人。py文件;我在想也許是像kivy那樣爲它的kivy-ios項目盜用了導入機制,並且嵌入最小的必需模塊是原始文本blob,但我並不確定如何繼續沿着該路徑前進〜 – Doug

回答

11

簡單的答案是可以的。

int main(int argc, char *argv[]) { 

    /* Setup */ 
    Py_NoSiteFlag = 1; // <--- This 
    Py_SetProgramName(argv[0]); 
    Py_Initialize(); 

    /* Run the 'main' module */ 
    int rtn = Py_Main(argc, argv); 
    Py_Finalize(); 

    return rtn; 
} 

據我所知,沒有什麼能夠中斷,你可以繼續使用所有東西(包括導入模塊的能力)。如果你試圖導入從沒有捆綁標準庫什麼,你會得到:

>>> import os; 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
ImportError: No module named os 

我會在這裏留下代碼副本的人誰的興趣;

https://github.com/shadowmint/cmake-python-embed-nostdlib

+1

我認爲,在不修改解釋器的情況下,應該避免導入'site.py'。當給定'-S'標誌時,主可執行文件會避免它。你必須檢查相關標誌('Py_NoSiteFlag')是內部的還是私人的。或者,在您的嵌入式版本中添加一個虛擬「site」模塊。這兩個選項似乎都比維護一個單獨的補丁更好,即使它非常簡單並且不太可能中斷。 – delnan

+0

@delnan你是完全正確的!謝謝!我更新了我的答案,以反映使用Py_NoSiteFlag,這絕對是一個更好的解決方案。 – Doug

+1

這對Python3來說似乎不夠用:http://stackoverflow.com/questions/34724057/embed-python3-without-standard-library –

1

AFAIK,你不能。如果沒有標準庫,Python甚至不會啓動,因爲它試圖找到os.py(在3.x; 2.x中的string.py)。啓動時,它會導入一些模塊,特別是site.py。您至少需要pythonxy.dll,可能還需要lib文件夾的內容,以及擴展模塊,即DLL文件夾的內容。

你可以運送一個文件pythonXX.zip(其中XX是版本號27或33),它應該是標準庫的壓縮副本。你可以自由地從你不需要的東西中提取圖書館;有各種靜態計算依賴項的工具(請參閱modulefinder)。

我想這就是爲什麼Lua作爲嵌入式腳本語言更受歡迎的原因。

相關問題