首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何阻止Py_Initialise使应用程序崩溃?

如何阻止Py_Initialise使应用程序崩溃?
EN

Stack Overflow用户
提问于 2011-09-27 14:26:21
回答 3查看 1.6K关注 0票数 4

在VBA和VB6中,我调用了一个动态链接库来创建一个Python解释器。如果将PATH环境变量设置为指向"C:\python27",将PYTHONPATH设置为"c:\python27\lib",则一切正常。

如果我没有设置PATH,那么调用Py_Initialise()会导致XL或我的VB6应用程序崩溃,即使我先用"c:\python27\python27.exe"调用Py_SetProgramName

我想在VB/VBA中指定安装,而不是在环境中设置,因为我不能在XL中这样做(适用于VB6)。

EN

回答 3

Stack Overflow用户

发布于 2011-10-07 23:48:45

到目前为止,我找到的最好的答案是,这是Python - http://bugs.python.org/issue6498中的一个bug。解释器似乎在某些错误时调用exit(),而不是将代码传回调用者。如果你在一个应用程序中嵌入python,那就不太友好了。但这就对了。

票数 3
EN

Stack Overflow用户

发布于 2011-09-30 21:50:05

在调用dll之前尝试更改工作目录:

在您的VBA代码中:

代码语言:javascript
复制
chdir("c:\python27\") '- change the working-directory for python
=> call dll '- call the dll
chdir(app.Path) '- change back to your folder (maybe you want to save your current folder bevore you change it the first time and change back to this?!)

致敬托马斯

票数 1
EN

Stack Overflow用户

发布于 2011-10-12 20:12:50

您可以简单地检查是否设置了所需的环境变量:

代码语言:javascript
复制
dim PPath as string
PPath = trim(Environ("PYTHONPATH"))
if (PPath<>"")
  <call dll>
else
  msgbox ("Error!")
end if

或者你可以在另一个测试进程中运行dll :如果这个调用工作,你知道调用dll是可以的-它取决于你使用的DLL调用,所以我不确定这一点:

代码语言:javascript
复制
Private Declare Function CloseHandle Lib "kernel32" (ByVal _
    hObject As Long) As Long

Private Declare Function OpenProcess Lib "kernel32" (ByVal _
    dwDesiredAccess As Long, ByVal bInheritHandle As _
    Long, ByVal dwProcessId As Long) As Long

Private Declare Function GetExitCodeProcess Lib "kernel32" _
    (ByVal hProcess As Long, lpExitCode As Long) As Long

Const STILL_ACTIVE = &H103
Const PROCESS_ALL_ACCESS = &H1F0FFF

...
dim IsActive as boolean
dim Handle as long
Dim TaskID As Long
TaskID = Shell("rundll32.exe pyton.dll Py_Initialise()", vbNormalNoFocus)

<wait for some time>

'- check if pyton.dll is still running
Handle = OpenProcess(PROCESS_ALL_ACCESS, False, TaskID)
Call GetExitCodeProcess(Handle, ExitCode)
Call CloseHandle(Handle)

IsActive = IIf(ExitCode = STILL_ACTIVE, True, False)

if (not IsActive) then
  msgbox ("Error!")
else
  <kill process>
  <call dll normally>
end if

致敬托马斯

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7565033

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档