簡體   English   中英

從C中的嵌入式python代碼加載DLL

[英]Loading DLL from embedded python code in c

我的問題的症結在於:

我正在Windows XP上使用MS Visual Studio 10.0開發代碼,並且需要嵌入Python來進行一些繪圖,文件管理和其他操作。 我在使用sys.path查找我的Pure-Python模塊時遇到問題,但是我通過修改PYTHONPATH解決了該問題。

現在,我的問題是讓python查找某些模塊引入的動態庫。 特別是我的問題是將文件夾壓縮到同名的bzip2文件夾中。

從普通的python命令提示符下,這可以正常工作:

import tarfile
tar=tarfile.open('Code.tar.bz2','w:bz2')
tar.add('Code',arcname='Code')
tar.close()

但是,當我從C代碼調用此代碼時,它給了我這個錯誤:

Traceback (most recent call last):
  File "<string>", line 4, in <module>
  File "D:\My_Documents\Code\ScrollModel\trunk\PythonCode.py", line 20, in Colle
ctFiles
    tar=tarfile.open(os.path.join(runPath,'CODE.tar.bz2'),'w:bz2')
  File "c:\Python26\lib\tarfile.py", line 1671, in open
    return func(name, filemode, fileobj, **kwargs)
  File "c:\Python26\lib\tarfile.py", line 1737, in bz2open
    raise CompressionError("bz2 module is not available")
tarfile.CompressionError: bz2 module is not available

我懷疑這個問題與嵌入式Python的 5.6節中所描述的相似,但是很難說出來。 如果我願意的話

Py_Initialize();
PyRun_SimpleString("import ssl\n");
Py_Finalize();

它也不起作用,我得到一個ImportError。

有人有這樣的問題嗎? 我錯過了重要的事情嗎?

試試這個,它可以在我的機器上工作。

在Visual Studio 2010中創建一個簡單的Windows控制台應用程序(刪除向導中的預編譯頭選項)。 用此代碼替換生成的代碼:

#include <Python.h>

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

    PyRun_SimpleString("import ssl        \n"
                       "for f in dir(ssl):\n"
                       "    print f       \n" );

    Py_Finalize();
    return 0;
}

將PYTHONHOME設置為c:\\ Python ...

  • 將C:\\ Python \\ Include添加到包含路徑
  • 將C:\\ Python \\ Libs添加到庫路徑
  • 將python26.lib添加到鏈接器輸入(根據您的Python版本進行調整)

建立。 從任何地方運行,您應該看到ssl模塊內容的列表。

我也嘗試過Mingw。 同一文件,使用以下命令行構建:

gcc -Wall -o test.exe embeed.c -I%PYTHONHOME%\Include -L%PYTHONHOME%\libs -lpython26

嘿,我問過類似的問題 ,我的操作系統是Linux

當我編譯c文件時,應添加$(python-config --cflags --ldflags)選項,如下

gcc test.c $(python-config --cflags --ldflags) -o test

我認為在Windows中,您還可以檢查python-config選項,希望對您有所幫助!

我在Boost C ++ DLL中遇到了類似的問題。 任何外部DLL都必須位於DLL搜索路徑中。

以我的經驗,PYTHONPATH影響Python模塊(Python中的import語句將結束LoadLibrary調用),而構建選項與此無關。

加載DLL時,Windows不在乎該過程是什么。 換句話說,Python遵循與記事本相同的DLL加載規則 您可以通過將缺少的DLL復制到與python擴展名相同的目錄中或路徑中的目錄中,來確認您面臨Windows路徑問題。

要查找任何其他可執行文件或DLL所需的DLL,只需使用DependencyWalker打開DLL或EXE文件。 還有一個“配置文件”菜單,它將允許您運行您的應用程序並觀看它搜索和加載DLL。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM