某个项目中涉及到这样一个情景: VB写的原始项目要调用Python的一些方法完成特殊的操作, 那么这就涉及到了,在.Net Framework中如何调用Python的脚本方法。

具体步骤流程如下所示:

(1): 展示一个简单的Python代码,即传递一个参数,然后返回修改后字符串,此文件名称为 mytest.py

def MyTestFunction(name):

return "testing " + name

(2): 我们借助第三方的工具来实现这个操作,那么这个第三方工具就是 IronPython,IronPython是一种在.Net及Mono上的Python实现,是一个基于微软的DLR引擎的开源项目,可以去这里下载或者跟踪源代码(https://github.com/IronLanguages/ironpython2)。 然后我们可以到这个链接中下载安装文件(https://github.com/IronLanguages/ironpython2/releases/tag/ipy-2.7.8), 安装文件安装完之后我们可以到对应的安装目录下面找到我们所需要的dll(IronPython.dll, IronPython.Modules.dll, Microsoft.Dynamic.dll, Microsoft.Scripting.dll)以及一个名为Lib的文件夹,如下图所示:

(3):我们用VS创建一个VB的工程,然后将上面的这四个dll引用进来,之后就可以进行具体的调用了,假设我们的Python代码文件放置的目录是 D:CodePyTestmytest.py 必要时请将此文件copy到VB执行目录中, 然后把对应的pythonPath换掉

如下代码所示:

Imports IronPython.Hosting

Imports Microsoft.Scripting.Hosting

Public Class Form1

Private Sub CallPython()

Dim pythonPath = "D:CodePyTestmytest.py"

Dim pyruntime as ScriptRuntime = Python.CreateRuntime()

Dim fileObj As Object = pyruntime.UseFile(pythonPath)

Dim result = fileObj.MyTestFunction("World")

End Sub

End Class

这样我们就通过IronPython完成了VB调用Python脚本方法,我们可以继续参考如下连接: https://blog.csdn.net/letunihao/article/details/41985163

这里Python的脚本方法非常单纯无暇,没有任何的其他脚本的引用, 但是实际项目中这样单纯的代码大多是没有意义的,总会引用其他的module来实现更加复杂的逻辑。

下面我们就要进阶了,如果Python脚本之间有相互的引用,如何完成我们的目标呢?请看如下步骤

(4):在相同的目录中创建另外一个Python文件来实现文件的读写,文件名为 mytest_common.py,

import os

class FileOperator:

def WriteInfoToFile(self, path):

file = open(path, "w")

file.write("Hello World")

file.close()

def ReadInfoFromFile(self, path):

fileInfo = ""

data = open(path)

for each_line in data:

fileInfo += each_line

data.close()

return fileInfo

为什么实现方法的时候要加入一个额外的参数 self?

请看如下连接: https://stackoverflow.com/questions/23944657/typeerror-method-takes-1-positional-argument-but-2-were-given/42016399

文件读写请参考 (http://www.pythonforbeginners.com/files/reading-and-writing-files-in-python)

(5):然后我们对 mytest.py 文件做如下修改,假设我们已经通过Python自己运行WriteInfoToFile方法已经生成了一个Test.txt文件

from mytest_common import FileOperator

def MyTestReadInfo():

fInfo = fOperator.ReadInfoFromFile("D:CodePyTestTest.txt")

return fInfo

fOperator = FileOperator()

(6):然后我们用如下VB代码进行对新的Python脚本方法的调用

Imports IronPython.Hosting

Imports Microsoft.Scripting.Hosting

Public Class Form1

Private Sub CallPython()

Dim pythonPath = "D:CodePyTestmytest.py"

Dim pyruntime as ScriptRuntime = Python.CreateRuntime()

Dim fileObj As Object = pyruntime.UseFile(pythonPath)

Dim result = fileObj.MyTestReadInfo()

End Sub

End Class

会throw exception说:某某某某module无法加载, 或者是找不到某某module。Unhandled Exception: IronPython.Runtime.Exceptions.ImportException: No module named ... 原因是:Python自己运行的时候会自动加载对应相关联的module,特别是一些系统的module,比如这里面的 os, 但是我们通过外部调用的时候无法自动建立这样的链接,因为我们要在Python的源文件中明确指明所引用的那些系统源文件所在folder,让其可以在指定的folder下面去寻找相关联的源文件。

那么这些源文件在什么地方呢?我们可以到Python的安装目录下寻找,也可以到我们第2步 IronPython的安装目录下面寻找,即Lib文件夹,然后将此文件夹copy到我们的测试Python的同级文件夹,用相对路径指定,当然你也可以不用copy,然后用绝对路径定位到Lib文件夹即可

代码如下所示:

import sys

sys.path.append(".Lib")

from mytest_common import FileOperator

def MyTestReadInfo():

fInfo = fOperator.ReadInfoFromFile("D:CodePyTestTest.txt")

return fInfo

fOperator = FileOperator()

这样我们再用第6步中的VB代码去调用就可以成功了。

注:使用相对路径时,请注意使用文件的位置,保证能够成功定位到。

更多详细信息可以参考如下连接:

https://stackoverflow.com/questions/6195781/ironpython-exe-compiled-using-pyc-py-cannot-import-module-os

https://thesesergio.wordpress.com/2013/09/11/how-to-generate-and-use-a-exe-that-uses-net-dlls-with-ironpython-pyc-py/

https://blog.csdn.net/letunihao/article/details/41985163

java调用python脚本_调用Python写vb的脚本方法相关推荐

  1. 第一章 第一节:Python基础_认识Python

    Python基础入门(全套保姆级教程) 第一章 第一节:Python基础_认识Python 1. 什么是编程 通俗易懂,编程就是用代码编写程序,编写程序有很多种办法,像c语言,javaPython语言 ...

  2. python写魔兽世界脚本_用python bat写软件安装脚本 + HM NIS Edit自动生成软件安装脚本...

    2019-03-11更新:原来NSIS脚本也可以禁用64位文件操作重定向的! 1.在安装脚本的开始处定义 LIBRARY_X64. !include "MUI.nsh" !incl ...

  3. 手机写python脚本_用Python写王者荣耀刷金币脚本

    王者荣耀很多朋友都想买脚本和挂之类的,想更加容易的获得金币等可以在游戏里买英雄等,今天我们发挥程序员的优势教给大家用Python语言自己写一个可以刷金币的脚本,以下是全部内容. 王者荣耀的冒险模式里有 ...

  4. python网络游戏脚本_用Python写一个游戏脚本,你会吗?

    学习python有一段时间了,由于python语言的强大和简洁,是一个不错的脚本语言,就准备做个游戏脚本练练手.如果你也想多练项目实战.可以去小编的Python交流.裙 :一久武其而而流一思(数字的谐 ...

  5. python怎么写游戏脚本_用PYTHON做一个简单的游戏脚本(基础,详细)

    引言 这段时间迷上了玩点点点的小游戏,但是某些重复的环节着实无聊,就想着能不能用PYTHON做一个游戏脚本,不过为了熟悉需要做脚本的各个模块,于是打算在4399上找一个比较像的游戏做个脚本练练手,后来 ...

  6. 按键精灵调用python插件_【Python 教程】使用 Python 和大漠插件进行文字识别

    家里有一台win7系统的电脑,平时可以用来玩玩游戏消磨时间.但是有时候有一些重复的操作实在是无趣,所以打算写个脚本,让其自动化执行. 最终的目标就是把游戏里一些常用的操作都集合到脚本中去,且无序随机执 ...

  7. python和易语言写游戏脚本_用Python写王者荣耀刷金币脚本

    王者荣耀很多朋友都想买脚本和挂之类的,想更加容易的获得金币等可以在游戏里买英雄等,今天我们发挥程序员的优势教给大家用Python语言自己写一个可以刷金币的脚本,以下是全部内容. 王者荣耀的冒险模式里有 ...

  8. python如何封装成可调用的库_在python中如何以异步的方式调用第三方库提供的同步API...

    在关于asyncio的基本用法中提到,asyncio并不是多线程.在协程中调用同步(阻塞函数),都占用同一线程的CPU时间,即当前线程会被阻塞(即协程只会在等待一个协程时可能出让CPU,如果是普通函数 ...

  9. python getattr调用自己模块_在Python中通过getattr获取对象引用的方法

    getattr函数 (1)使用 getattr 函数,可以得到一个直到运行时才知道名称的函数的引用. >>> li = ["Larry", "Curly ...

  10. python调用chrome插件_使用Python开发chrome插件

    标签: 谷歌Chrome插件是使用HTML.JavaScript和CSS编写的.如果你之前从来没有写过Chrome插件,我建议你读一下这个.在这篇教程中,我们将教你如何使用Python代替JavaSc ...

最新文章

  1. 从2019年-2021年的各大顶会论文,看动态神经网络的发展
  2. Java黑皮书课后题第3章:*3.20(科学:风寒温度)编写一个程序,提示用户输入一个温度值和一个风速值。如果输入值合法,那么显示风寒温度,否则显示温度或风速是不合法数据
  3. LinkedList专题3
  4. java兔子问题流程图_C语言编程狼追兔子问题代码解析
  5. 【正则化】各种Dropout方法
  6. ios 后台唤醒应用_苹果不用背锅了!微信被杀后台是因为“耍流氓”?用户该听谁的?...
  7. python函数库_ctypes --- Python 的外部函数库 — Python 3.9.0 文档
  8. 网络安全实验室 脚本关 解析
  9. freeSWITCH之安装
  10. 计算机del键作用,Delete是什么键,Delete键和Del键的区别是什么?
  11. 软件测试需要学数学,现在才开始学软件测试还有前途吗?
  12. router路由传参 - props
  13. xp计算机无法远程桌面连接,XP sp3系统下远程桌面不能连接到指定计算机的解决方案...
  14. 经典组合 堡垒主机构建防火墙系统
  15. ssm校园兼职招聘系统计算机毕业设计
  16. 视频之四:视频流连接
  17. 推荐25个强大的 jQuery 网页布局设计作品欣赏
  18. c++擦除mbr代码
  19. 5g空分复用技术_中兴首席科学家向际鹰:空分复用是实现5G的关键
  20. dlr 动态语言_Hanselminutes播客271-内部IronJS-.NET DLR上的完整JavaScript / ECMAScript开源实现

热门文章

  1. mysql数据库建order,group表时的错误
  2. HTTP Error 500.19 – Internal Server Error – 0x80070021 (IIS 8.5)
  3. web开发 开发一个能发送邮件的应用
  4. bzoj2761 [JLOI2011]不重复数字
  5. ssh mysql 命令_ssh mysql命令大全
  6. oracle有没有稀疏列,稀疏 BLAS - Oracle® Developer Studio 12.5:性能库用户指南
  7. python视频分段_Python 视频文件的分割和合并
  8. python多进程关闭socket_Python并发编程-多进程socketserver简易版
  9. python怎么定义全局变量_python中如何定义全局变量
  10. NDArray基础语法知识(与Numpy的对比)