簡體   English   中英

使用 python27.dll 運行 python 腳本

[英]Run python script using python27.dll

是否可以使用 python27.dll 從 CLI 運行 .py 腳本? 我試過這個:

rundll32.exe python27.dll,PyRun_SimpleString "import myScript.py"

但似乎不起作用。

情況是我可以安裝我想要的所有 python 模塊,但沒有可執行文件,所以我無法安裝完整的 Python。

你不能這樣做。 為什么?

Windows 包含一個名為rundll32.exe的命令行實用程序,它允許您使用以下語法調用從 32 位 DLL 導出的函數:

RUNDLL.EXE <dllname>,<entrypoint> <optional arguments>

但是,根據 MSDN:

Rundll32 程序不允許您從任何 DLL 調用任何導出的函數

[..]

這些程序只允許您從 DLL 中調用函數,這些函數被顯式編寫為由它們調用。

dll必須導出以下原型才能支持它:

void CALLBACK EntryPoint(HWND hwnd, HINSTANCE hinst,
                         LPSTR lpszCmdLine, int nCmdShow);

由於python.dll不導出這樣的入口點,因此您必須在 C/C++ 中編寫一個包裝應用程序來加載 dll 並使用它,例如(這里是這樣一個應用程序的片段):

// load the Python DLL
#ifdef _DEBUG
LPCWSTR pDllName = L"python27_d.dll" ;
#else
LPCWSTR pDllName = L"python27.dll" ;
#endif

HMODULE hModule = LoadLibrary( pDllName ) ;
assert( hModule != NULL ) ;
 
// locate the Py_InitializeEx() function
FARPROC pInitializeExFn = GetProcAddress( hModule , "Py_InitializeEx" ) ;
assert( pInitializeExFn != NULL ) ;
 
// call Py_InitializeEx()
typedef void (*PINITIALIZEEXFN)( int ) ;
((PINITIALIZEEXFN)pInitializeExFn)( 0 ) ;

FILE* fp ;
errno_t rc = fopen_s( &fp , pFilename , "r" ) ;
assert( rc == 0 && fp != NULL ) ;

[..] // go on to load PyRun_SimpleFile
if ( 0 == PyRun_SimpleFile( fp , pFilename )
    printf("Successfully executed script %s!\n", pFilename);

來源:Awasu.com 第一教程

暫無
暫無

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

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