奇迹无处不在,看吧,我就来用 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

  1. C:\xiaohui\python-u8>pip install pythonnet
  2. 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
  3. Requirement already satisfied: pythonnet in c:\python\python2.7.18\lib\site-packages (2.5.2)
  4. Requirement already satisfied: pycparser in c:\python\python2.7.18\lib\site-packages (from pythonnet) (2.21)
  5. WARNING: You are using pip version 19.2.3, however version 20.3.4 is available.
  6. You should consider upgrading via the 'python -m pip install --upgrade pip' command.
  7. C:\xiaohui\python-u8>

本机我已安装过了

导入模块、类等

Python.NET 允许将 CLR 命名空间本质上视为 Python 包。

  1. from System import String
  2. from System.Collections import *

可以以这种方式导入和使用来自任何已加载程序集的类型。要加载程序集,请使用模块AddReference中的函数clr:

  1. import clr
  2. clr.AddReference("System.Windows.Forms")
  3. from System.Windows.Forms import Form

注意Python.NET 的早期版本依赖于“隐式加载”来支持自动加载名称对应于导入命名空间的程序集。隐式加载仍然适用于向后兼容,但将在未来版本中删除,因此建议使用该clr.AddReference方法。

除了通常的应用程序库和 GAC 之外,Python.NET 还使用 PYTHONPATH (sys.path) 来查找要加载的程序集。为确保您可以隐式导入程序集,请将包含程序集的目录放在sys.path.

  1. #!/usr/bin/python
  2. # coding=utf-8
  3. '''
  4. 导入 clr csharp 的类
  5. Python 会将 pythonnet clr(公共语言运行)视为自己的
  6. '''
  7. import clr
  8. # 先测试 DateTime
  9. from System import DateTime,Console
  10. Console.WriteLine(u"测试 Datetime, 当前时间:")
  11. Console.WriteLine(DateTime.Now)
  12. # 使用类
  13. from System import String, Char, Environment, Int32
  14. # 使用属性
  15. # 机器名字
  16. name = Environment.MachineName
  17. Console.WriteLine(name)
  18. Console.WriteLine(Environment.ExitCode)
  19. # 使用方法
  20. drives = Environment.GetLogicalDrives()
  21. Console.WriteLine(drives)
  22. # 使用重载
  23. '''
  24. 在大多数情况下,Python.NET 可以根据参数确定要自动调用的正确构造函数。
  25. 在某些情况下,可能需要调用特定的重载构造函数,该构造函数由特殊 __overloads__属性支持,
  26. 该属性很快将被弃用,取而代之的是与 iPy 兼容的“重载”,在类上:
  27. '''
  28. s1 = String.Overloads[Char, Int32]('A', 10)
  29. print s1
  30. # 输入一个字母,就是字符,两个就不是???
  31. s2 = String.__overloads__[Char, Int32]('x', 1)
  32. print s2
  33. # 字符串
  34. str1 = u"小辉辉"
  35. Console.WriteLine(str1)
  36. # 测试集合
  37. from System.Collections import Hashtable
  38. # 先看一下hashtable 的文档,使用 Python 方式
  39. print(Environment.GetFolderPath.__doc__)
  40. print(">>>>>>>>"*3)
  41. print(Hashtable.__doc__)
  42. print(">>>>>>>>"*3)
  43. print(String.__doc__)
  44. print(">>>>>>>"*3)
  45. # help 查看文档
  46. # help 内容有些多,太详细了也是错
  47. # help(Hashtable)
  48. table = Hashtable()
  49. table["key 1"] = "value 1"
  50. table[u"小辉辉"] = u"小花花"
  51. Console.WriteLine(table)
  52. # 使用循环
  53. for k in table.Keys:
  54. print k
  55. for v in table.Values:
  56. print v
  57. print "--"*20
  58. for k,v in table.Keys, table.Values:
  59. print k, v

导入 dll 类库

  1. #!/usr/bin/python
  2. # coding=utf-8
  3. import sys
  4. import os
  5. import clr
  6. import datetime,time
  7. from System import Environment,DateTime,Collections
  8. path = os.getcwd()+r"\u8\b1\Debug"
  9. print path
  10. sys.path.append(path)
  11. clr.AddReference("Hermes")
  12. from Hermes import Comm
  13. instance = Comm()
  14. r = instance.get()
  15. print r
  16. print r.Body
  17. print r.Msg
  18. print r.Code
  19. for s in r.Body:
  20. print s
  21. from Hermes import Response
  22. help(Response)