详细看demo25的代码

These techniques are demonstrated in Demo25 in the examples folder of your Python for Delphi distribution.

The old vs. the new ways.

Because Delphi 6 has custom variants, they can point to specific smart proxies for python objects.  Before Delphi 6, you could have an oleVariant pointing to a python instance, but you couldn't do the smart things like know that it was a list type etc.

The following examples assume you have a module called LoginMgr.py in the python path or in the same folder as your application  .exe that you have built in Delphi.  Note that the python file LoginMgr.py contains within it a python class called LoginMgr which has a method called somemethod.

Old way   (see my basic tutorial for more info
on the AndyDelphiPy functions.)
New way  (requires Delphi 6)

// Drop a TPythonAtomEngine onto your form
// or datamodule and name it PE
// You also need to drop a pythonDelphiVar
// component and call it pdv

uses AndyDelphiPy;

var
  obj : olevariant;
begin

AndyDelphiPy.PyExeFile('LoginMgr.py', PE);
obj  := AndyDelphiPy.PyClass('LoginMgr()', pdv, PE);
obj.somemethod()    // call the method

// Drop a TPythonAtomEngine or TPythonEngine
// onto your form or datamodule.

uses VarPyth;

var
  mymodule, obj: variant;
begin

mymodule := Import('LoginMgr');
obj := mymodule.LoginMgr();
obj.somemethod()    // call the method

Note that it it possible to slightly mix the old and new way, so that if you use the AndyDelphiPy.PyExeFile('LoginMgr.py', PE); to import the module then you can then switch to the new way, declare an obj: variant; then instantiate an instance using obj := MainModule.LoginMgr();  However you still need Delphi 6 and so you might as well just use the new way properly.

Widestrings

Declare your delphi strings widestrings if you want to get more than 255 chars back from calls to python methods that return strings. e.g.

var
   s : widestring;
begin
  s := mypythonclassinstance.somemethod() ;
showmessage(s) ;

Booleans

If your python method call returns 1 or 0 and this is supposed to be interpreted as a boolean, then cast it inside Delphi e.g.

if Boolean( mypythonclassinstance.somemethod()) then
....

Accessing syspath directly

Here is a function that accesses a global variable called SysModule and access the syspath directly.

This function also calls VarIsPythonSequence which tests to see if the parameter passed is a list or not.

procedure TForm1.Button2Click(Sender: TObject);
const
LIB = 'E:\\ZopeWebSite\\bin\\lib';
LIBDLL = 'E:\\ZopeWebSite\\bin\\DLLs';
var
re : variant;
m : variant;
begin
memo1.lines.Add('SysModule.path is ' + SysModule.path);
memo1.lines.Add('');
Assert(VarIsPythonSequence(SysModule.path));
displaySysPath(ListBox1);
  if not Boolean(SysModule.path.Contains(LIB)) then
SysModule.path.insert(0,LIB);
SysModule.path.append(LIBDLL);
memo1.lines.Add('SysModule.path now is ' + \
SysModule.path + #13#13);
displaySysPath(ListBox1);
  fixSysPath;    
  re := Import('re');
showmessage(re);
  m := Import('xml.dom.minidom');
showmessage(m);
end;    

Playing with sys paths

This is an example of how to set the python system path as seen by delphi's instance of the python interpreter (as represented by the pythonEngine component).  Note that it is imperative that you have \\ as the slashed in your path as otherwise things like \fred will actually be interpreted as \f (whatever that escaped character is) plus 'red'. 

Technique 1
procedure TForm1.fixSysPath;
const
LIB = 'E:\\ZopeWebSite\bin\\lib';
LIBDLL = 'E:\\ZopeWebSite\\bin\\DLLs';
begin
  // this is illegal
// SysModule.path.Clear;
  // this will work with latest python for delphi components OK.
//SysModule.path := NewPythonList;
  // this is a boring but effective solution as well.
while SysModule.path.Length > 1 do
SysModule.path.pop;
  SysModule.path.append(LIBDLL);
SysModule.path.append(LIB);
end;
Technique 2
procedure TForm1.btnClearSyspathToJustLibClick(Sender: TObject);
var
currdir, libdir : string;
begin
currdir := ExtractFilePath( Application.ExeName );

NOTE: Simply putting a window path as the currdir will ultimately fail since the paths returned by Delphi have single slashes and python needs wither unix slashes or \\ slashes. See here for an algorithm to handle this.

  libdir := EnsurePathHasDoubleSlashes(libdir);    
  libdir := currdir + 'Lib';    
  SysModule.path := NewPythonList;
// Relies on Jan 2002 install of python for Delphi components
  SysModule.path.append(currdir);
SysModule.path.append(libdir);
end;

NOTE:  See the python for delphi deployment section for a more in-depth discussion of paths.

Supplimentary utility to display the python syspath in a delphi gui control.

procedure TForm1.btnDisplaySysPathClick(Sender: TObject);
begin
  ListBox1.clear;
  displaySysPath(ListBox1);
end;

Writing a Delphi function that uses a python function to do the hard work.

Here is an example of writing a delphi utility function that takes a string, and splits it up (delimited by comma) and puts the result into a delphi list box.  We are using python split function to do the splitting - cool eh?

procedure TForm1.splitAstring(str:string; lstbox: TListBox);
var
s, lzt : variant;
i : integer;
begin
s := VarPythonCreate(str);
// convert normal string into a python string.
lzt := s.split(',');
  for i := 0 to lzt.Length-1 do
lstbox.Items.Add(lzt.GetItem(i))
end;

Displaying the python syspath in a delphi listbox

Even though we have a pointer to a python list object (via a Delphi variant), we still have to call .GetItem(i) on a python list rather than the python syntax of lzt[i] - why? Because we are in Delphi and thus we cannot use python syntax. 

procedure TForm1.displaySysPath(lstbox: TListBox);
var
lzt : variant;
i : integer;
begin
Assert(VarIsPythonSequence(SysModule.path));
lzt := SysModule.path;
for i := 0 to lzt.Length-1 do
lstbox.Items.Add(lzt.GetItem(i));
lstbox.Items.Add('----------------------------------');
end;

Loading python base64 and minidom module and processing XML in Delphi

procedure TForm1.minidomLoadClick(Sender: TObject);
var
m, doc, top : variant;
s : string;
begin
fixSysPath;
displaySysPath(ListBox1);
  m := Import('base64');
showmessage(m);
s := m.encodestring('this is some text which I am going to encode then decode again.');
showmessage(s + #13+#13 + m.decodestring(s));
  m := Import('xml.dom.minidom');
doc := m.Document();
showmessage(doc);
  top := doc.createElement( 'Workspace' );
top.setAttribute('Version', '1.1 beta4');
doc.appendChild(top);
  s := doc.toxml();
showmessage('doc.toxml()' + #13+#13 + s);
end;    

Importing your own class

Ensure you have a TPythonAtomEngine or TPythonEngine onto your form or datamodule.

var
mymodule, obj: variant;
begin
mymodule := Import('LoginMgr');
obj := mymodule.LoginMgr();
obj.somemethod() // call the method

python4delphi 设置syspath的更多相关文章

  1. Linux命令总结大全,包含所有linux命令

    使用说明:此文档包含所有的Linux命令,只有你想不到的没有你看不到的,此文档共计10万余字,有8400多行,预计阅读时间差不多需要3个小时左右,所以要给大家说一说如何阅读此文档 为了方便大家阅读,我 ...

  2. python4delphi 使用

    Python 开发桌面程序, 之前写过一个使用IronPython的博客. 下面这个方案使用 delphi 作为主开发语言,通过 python4delphi 控件包将 python 作为 script ...

  3. python4delphi 安装

    环境搭建: 目前p4d已经可以支持到XE7,可惜googlecode即将关闭,不知道作者是否会在github上继续更新. 因为此开源项目历史较久远,拿到源代码后可能还需要手动修改相关的文件引用,毕竟需 ...

  4. 利用API设置桌面背景

    实现效果: 知识运用: API函数SystemParametersInfo 实现代码: [DllImport("user32.dll", EntryPoint = "Sy ...

  5. 【.net 深呼吸】设置序列化中的最大数据量

    欢迎收看本期的<老周吹牛>节目,由于剧组严重缺钱,故本节目无视频无声音.好,先看下面一个类声明. [DataContract] public class DemoObject { [Dat ...

  6. LINUX篇,设置MYSQL远程访问实用版

    每次设置root和远程访问都容易出现问题, 总结了个通用方法, 关键在于实用 step1: # mysql -u root mysql mysql> Grant all privileges o ...

  7. Visual Studio Code 代理设置

    Visual Studio Code (简称 VS Code)是由微软研发的一款免费.开源的跨平台文本(代码)编辑器,在十多年的编程经历中,我使用过非常多的的代码编辑器(包括 IDE),例如 Fron ...

  8. myeclipse学习总结一(在MyEclipse中设置生成jsp页面时默认编码为utf-8编码)

    1.每次我们在MyEclispe中创建Jsp页面,生成的Jsp页面的默认编码是"ISO-8859-1".在这种情况下,当我们在页面中编写的内容存在中文的时候,就无法进行保存.如下图 ...

  9. Linux scp 设置nohup后台运行

    Linux scp 设置nohup后台运行 1.正常执行scp命令 2.输入ctrl + z 暂停任务 3.bg将其放入后台 4.disown -h 将这个作业忽略HUP信号 5.测试会话中断,任务继 ...

随机推荐

  1. Bootstrap3.0学习第十六轮(进度条、媒体对象、列表组、面板)

    详情请查看http://aehyok.com/Blog/Detail/23.html 个人网站地址:aehyok.com QQ 技术群号:206058845,验证码为:aehyok 本文文章链接:ht ...

  2. JavaScript事件---事件对象

    发文不易,若转载传播,请亲注明出处,谢谢!   内容提纲: 1.事件对象 2.鼠标事件 3.键盘事件 4.W3C与IE JavaScript事件的一个重要方面是它们拥有一些相对一致的特点,可以给你的开 ...

  3. 配置个舒心的 Java 开发环境

    Redmonk发布Java框架流行度调研结果:http://www.infoq.com/cn/news/2016/09/redmonk-java-frameworks 尝试:Intellij IDEA ...

  4. Shell good example

    (1) Source code #! /bin/bash reference ()     {     pa=\$"$1"     echo $pa     x=`eval &qu ...

  5. Gallery 图片画廊

    Gallery 图片画廊 学习网址http://amazeui.org/widgets/gallery?_ver=2.x

  6. Oracle查看锁表

     查看锁表进程SQL语句1: select sess.sid,     sess.serial#,     lo.oracle_username,     lo.os_user_name,     a ...

  7. java的static块执行时机

    一.误区:简单认为JAVA静态代码块在类被加载时就会自动执行.证错如下: class MyClass1 { static {//静态块 System.out.println("static  ...

  8. include ""与include<>

    在C程序中包含文件有以下两种方法:(1)用符号“<”和“>”将要包含的文件的文件名括起来.这种方法指示预处理程序到预定义的缺省路径下寻找文件.预定义的缺省路径通常是在INCLUDE环境变量 ...

  9. 思维固化,addTarget难道就只能给self

    使用前提 调用某个对象的,一个无参数的方法 如[self.view resignFirstResponder] 注意 [self.view endEdting:YES]就不行,要是无参数的

  10. WPF 复制和粘贴

    /// <summary> /// 复制或剪切文件到剪切板 /// </summary> /// <param name="files">文件路 ...