繁体   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