2009-12-26 102 views
1

我試圖通過我編寫的幾個C函數來擴展Python解釋器。從閱讀文檔,爲了公開這些功能,用戶必須導入包含功能的模塊。擴展Python:預加載我的C模塊

是否有可能通過C API來加載預加載或預導入模塊,使用戶不必鍵入import <mymodule>?或者更好,from <mymodule> import <function>?我可以在Py_Initialize()後面執行PyRun_SimpleString(「from mymodule import myfunction」);我可以在Py_Initialize()之後執行PyRun_SimpleString(「from mymodule import myfunction」)。 - 我只是想知道是否有另一種方式來做到這一點..?

編輯2:換句話說,我有一個用C語言編寫的嵌入Python解釋器的應用程序。該應用程序提供了一些我想要公開給用戶的功能,以便他們可以爲應用程序編寫簡單的Python腳本。我所要做的就是取消編寫from mymodule import myfunction1, myfunction2的需求,因爲它是非常專業化的應用程序,並且腳本無論如何都不會在沒有應用程序的情況下工作,所以一直要求import ...毫無意義。

+0

爲什麼你需要這樣做?爲什麼? – shylent 2009-12-26 14:47:29

+0

「,以便用戶不必鍵入導入」 – EcirH 2009-12-26 14:51:51

+0

根據您的編輯,它是一個腳本,因此您可以在腳本中添加'from mymodule import ...'。沒有人需要再輸入那個。 – 2009-12-26 18:59:45

回答

0

沒有。你可以將它添加到Python解釋器本身,但這意味着創建一個自定義的Python版本,我猜這不是你想要的。

import <mymodule>不只是加載模塊,它也是使該模塊中(主|電流)可見的命名空間。能夠做到這一點,不用黑客攻擊實際的Python解釋器,會非常強烈地反對「顯式優於隱式」。

+0

當前命名空間可能是字典,對嗎?所以它可能會以某種方式找到該dict和AddItem()我的功能......? – EcirH 2009-12-26 14:35:53

+0

@EricH - 即使它有可能以某種詭計的方式出現,也不要這樣做。這在Python中不是慣用的,不是用戶期望的,通常也是一種不好的做法。 – 2009-12-26 15:03:21

3

即使你在Python中實現一個模塊,用戶將不得不import它。這是Python的工作方式,它實際上是一件好事 - 這是Python的偉大的長處之一 - 命名空間/模塊系統是強大的,易於使用和易於理解。

學術練習而已,你當然可以添加新的功能,Python本身,通過創建一個自定義的解釋。你甚至可以用這種方式創建新的關鍵字。但是出於任何實際目的,這不被推薦。

2

一般來說,沒有。但是,如果用戶只打算在交互式會話中使用模塊,並且可以設置其環境變量,則可以將PYTHONSTARTUP environmental variable設置爲在交互式會話啓動時運行的腳本。

我能想到的唯一情況是,如果你和你的小組正在使用python進行數據分析,定製命令爲您的特定問題,大多數用戶比程序員更多的科學家/統計學家。但即使在這種情況下,我也會建議使用IPython,創建一個IPython profile,然後爲用戶創建一個別名/腳本來運行。它更乾淨,不同的名稱警告他們不使用默認的Python環境。

1

如果你真的想這樣做,設置您PYTHONSTARTUP環境變量指向的文件。在shkshbash等,你可以這樣做:

PYTHONSTARTUP=$HOME/.pystartup 
export PYTHONSTARTUP 

然後,你就可以把語句和代碼在你$PYTHONSTARTUP文件:

echo "import blah" >>$PYTHONSTARTUP 

應該這樣做。它僅適用於交互式會話。

0

查看關於如何在嵌入式python中預導入模塊的博客文章。

Embed Python and Import Modules in C/C++

例如模擬在Python下面的語句:

from hashlib import md5, sha1 

我們做的在C:

PyObject * subModules = PyList_New(0); 
PyList_Append(subModules, PyString_FromString("md5")); 
PyList_Append(subModules, PyString_FromString("sha1")); 
PyObject * hashlibImports = PyImport_ImportModuleEx("hashlib", NULL, NULL, subModules); 
PyObject * md5Module = PyObject_GetAttr(hashlibImports, PyString_FromString("md5")); 
PyObject * sha1Module = PyObject_GetAttr(hashlibImports, PyString_FromString("sha1")); 
PyObject * mainModule = PyImport_AddModule("__main__"); 
PyModule_AddObject(mainModule, "md5", md5Module); 
PyModule_AddObject(mainModule, "sha1", sha1Module); 

另外這裏是到relevant code鏈接這篇文章中提到的項目基本上都是y執行:

from OpenGL.GL import * 
from OpenGL.GLU import * 
from OpenGL.GLUT import * 

Python初始化後。