0

我将 D7 与 Python4Delphi 一起使用。在用户导入大量 py 文件后,Python 会缓存所有这些模块。我需要一种方法来重置 Py 引擎。这样 Py 就会“忘记”所有用户导入的模块,并且我有“干净”的 Python,而无需重新启动应用程序。怎么做?

4

2 回答 2

2

销毁并重新创建TPythonEngine对象就足够了:

OriginalOwner := GetPythonEngine.Owner;
GetPythonEngine.Free;
TPythonEngine.Create(OriginalOwner);

销毁它会调用Py_Finalize,这会释放 Python DLL 分配的所有内存。

或者,如果您只是在没有 VCL 包装器的情况下使用 Python API,您可能只需要调用Py_NewInterpreter您的TPythonInterface对象来获得一个新的执行环境,而不必丢弃之前所做的一切。

于 2014-01-30T18:36:37.980 回答
2

在https://github.com/pyscripter/python4delphi/tree/master/PythonForDelphi/Demos/Demo34有一个演示向您展示如何使用 P4D 卸载/重新加载 python 。(重新)创建python组件和(重新)加载不同版本的python的关键方法如下所示:

procedure TForm1.CreatePythonComponents;
begin
  if cbPyVersions.ItemIndex <0 then begin
    ShowMessage('No Python version is selected');
    Exit;
  end;

  // Destroy P4D components
  FreeAndNil(PythonEngine1);
  FreeAndNil(PythonType1);
  FreeAndNil(PythonModule1);

  { TPythonEngine }
  PythonEngine1 := TPythonEngine.Create(Self);
  PyVersions[cbPyVersions.ItemIndex].AssignTo(PythonEngine1);

  PythonEngine1.IO := PythonGUIInputOutput1;

  { TPythonModule }
  PythonModule1 := TPythonModule.Create(Self);

  PythonModule1.Name := 'PythonModule1';
  PythonModule1.Engine := PythonEngine1;
  PythonModule1.ModuleName := 'spam';
  with PythonModule1.Errors.Add do begin
    Name := 'PointError';
    ErrorType := etClass;
  end;
  with PythonModule1.Errors.Add do begin
    Name := 'EBadPoint';
    ErrorType := etClass;
    ParentClass.Name := 'PointError';
  end;

  { TPythonType }
  PythonType1 := TPythonType.Create(Self);

  PythonType1.Name := 'PythonType1';
  PythonType1.Engine := PythonEngine1;
  PythonType1.OnInitialization := PythonType1Initialization;
  PythonType1.TypeName := 'Point';
  PythonType1.Prefix := 'Create';
  PythonType1.Services.Basic := [bsRepr,bsStr,bsGetAttrO,bsSetAttrO];
  PythonType1.TypeFlags :=
    [tpfHaveGetCharBuffer,tpfHaveSequenceIn,tpfHaveInplaceOps, 
   tpfHaveRichCompare,tpfHaveWeakRefs,tpfHaveIter,tpfHaveClass,tpfBaseType];
  PythonType1.Module := PythonModule1;

  PythonEngine1.LoadDll;
end;

该演示使用单元 PythonVersions 来发现已安装的 Python 版本。

于 2019-01-07T03:31:26.477 回答