奇迹无处不在,看吧,我就来用 Python 调用 c#。
参考: http://pythonnet.github.io/
https://github.com/pythonnet/pythonnet
pythonnet 官网简述
Python.NET ( pythonnet) 是一个包,它使 Python 程序员与 Windows 上的 .NET 4.0+ 公共语言运行时 (CLR) 和 Linux 和 OSX 上的 Mono 运行时几乎无缝集成。Python.NET 为 .NET 开发人员提供了一个强大的应用程序脚本工具。使用这个包,您可以编写 .NET 应用程序或在 Python 中构建整个应用程序,使用以 CLR(C#、VB.NET、F#、C++/CLI)为目标的任何语言编写的 .NET 服务和组件。
请注意,此包没有_将_Python 实现为一流的 CLR 语言 - 它不会从 Python 代码生成托管代码 (IL)。相反,它是 CPython 引擎与 .NET 或 Mono 运行时的集成。这种方法允许您使用 CLR 服务并继续使用现有的 Python 代码和 C-API 扩展,同时保持 Python 代码的本机执行速度。如果您对 Python 语言的纯托管代码实现感兴趣,您应该查看 IronPython项目,该项目正在积极开发中。
Python.NET 目前与 Python 版本 2.7 和 3.5-3.8 兼容并经过测试。当前版本可在Python.NET 网站上获得。要订阅Python.NET 邮件列表或阅读列表的 在线存档,请参阅邮件列表信息 页面。使用Python.NET 问题跟踪器报告问题。
安装 pythonnet:pip install pythonnet
C:\xiaohui\python-u8>pip install pythonnet
DEPRECATION: Python 2.7 will reach the end of its life on January 1st, 2020. Please upgrade your Python as Python 2.7 won't be maintained after that date. A future version of pip will drop support for Python 2.7. More details about Python 2 support in pip, can be found at https://pip.pypa.io/en/latest/development/release-process/#python-2-support
Requirement already satisfied: pythonnet in c:\python\python2.7.18\lib\site-packages (2.5.2)
Requirement already satisfied: pycparser in c:\python\python2.7.18\lib\site-packages (from pythonnet) (2.21)
WARNING: You are using pip version 19.2.3, however version 20.3.4 is available.
You should consider upgrading via the 'python -m pip install --upgrade pip' command.
C:\xiaohui\python-u8>
本机我已安装过了
导入模块、类等
Python.NET 允许将 CLR 命名空间本质上视为 Python 包。
from System import String
from System.Collections import *
可以以这种方式导入和使用来自任何已加载程序集的类型。要加载程序集,请使用模块AddReference中的函数clr:
import clr
clr.AddReference("System.Windows.Forms")
from System.Windows.Forms import Form
注意Python.NET 的早期版本依赖于“隐式加载”来支持自动加载名称对应于导入命名空间的程序集。隐式加载仍然适用于向后兼容,但将在未来版本中删除,因此建议使用该clr.AddReference方法。
除了通常的应用程序库和 GAC 之外,Python.NET 还使用 PYTHONPATH (sys.path) 来查找要加载的程序集。为确保您可以隐式导入程序集,请将包含程序集的目录放在sys.path.
#!/usr/bin/python
# coding=utf-8
'''
导入 clr csharp 的类
Python 会将 pythonnet clr(公共语言运行)视为自己的
'''
import clr
# 先测试 DateTime
from System import DateTime,Console
Console.WriteLine(u"测试 Datetime, 当前时间:")
Console.WriteLine(DateTime.Now)
# 使用类
from System import String, Char, Environment, Int32
# 使用属性
# 机器名字
name = Environment.MachineName
Console.WriteLine(name)
Console.WriteLine(Environment.ExitCode)
# 使用方法
drives = Environment.GetLogicalDrives()
Console.WriteLine(drives)
# 使用重载
'''
在大多数情况下,Python.NET 可以根据参数确定要自动调用的正确构造函数。
在某些情况下,可能需要调用特定的重载构造函数,该构造函数由特殊 __overloads__属性支持,
该属性很快将被弃用,取而代之的是与 iPy 兼容的“重载”,在类上:
'''
s1 = String.Overloads[Char, Int32]('A', 10)
print s1
# 输入一个字母,就是字符,两个就不是???
s2 = String.__overloads__[Char, Int32]('x', 1)
print s2
# 字符串
str1 = u"小辉辉"
Console.WriteLine(str1)
# 测试集合
from System.Collections import Hashtable
# 先看一下hashtable 的文档,使用 Python 方式
print(Environment.GetFolderPath.__doc__)
print(">>>>>>>>"*3)
print(Hashtable.__doc__)
print(">>>>>>>>"*3)
print(String.__doc__)
print(">>>>>>>"*3)
# help 查看文档
# help 内容有些多,太详细了也是错
# help(Hashtable)
table = Hashtable()
table["key 1"] = "value 1"
table[u"小辉辉"] = u"小花花"
Console.WriteLine(table)
# 使用循环
for k in table.Keys:
print k
for v in table.Values:
print v
print "--"*20
for k,v in table.Keys, table.Values:
print k, v
导入 dll 类库
#!/usr/bin/python
# coding=utf-8
import sys
import os
import clr
import datetime,time
from System import Environment,DateTime,Collections
path = os.getcwd()+r"\u8\b1\Debug"
print path
sys.path.append(path)
clr.AddReference("Hermes")
from Hermes import Comm
instance = Comm()
r = instance.get()
print r
print r.Body
print r.Msg
print r.Code
for s in r.Body:
print s
from Hermes import Response
help(Response)