C#调用Python

环境:Windows 8.1,已经安装Python2.7(C:\Python27),配置了环境变量. 已经安装VS2013,VS2017

1.安装IronPython

下载地址http://ironpython.net/download/ 我下载的是IronPython-2.7.4.3261515540.msi

安装目录为:F:\Program Files (x86)\IronPython 2.7

2.新建C#项目

打开vs2013,新建控制台程序CSharpCallPython

3.添加引用

在CSharpCallPython中添加引用,F:\Program Files (x86)\IronPython 2.7\Platforms\Net40下的IronPython.dll和Microsoft.Scripting.dll

4.在CSharpCallPython添加py脚本文件Python1.py,,并选择复制到本地,代码如下

  1. def add(num1,num2):
  2. return num1+num2;

5.在CSharpCallPython添加代码

  1. ScriptRuntime pyRuntime = Python.CreateRuntime(); //创建一下运行环境
  2.  
  3. dynamic obj = pyRuntime.UseFile("Python1.py"); //调用一个Python文件
  4.  
  5. int a = , b = ;
  6.  
  7. int sum = obj.add(a,b); //调用Python文件中的求和函数
  8. Console.Write("Sum:");
  9. Console.WriteLine(sum);

运行结果Sum=3

调用到此结束,谢谢大家. 如果这样也许,那么这是不可能的.请看下文

6.如何引用第三方库

如何使用os下面的库呢,咱们继续 继续添加py脚本文件python2.py

  1. #!/usr/bin/python
  2. # -*- coding: UTF-8 -*-
  3. import os
  4. import shutil
  5.  
  6. def ClearDirect(path):#
  7.  
  8. for root, dirs, files in os.walk(path,topdown=False):
  9. print 'root',root
  10. for dir in dirs:
  11.  
  12. print 'delete:',os.path.join(root, dir)
  13. #os.removedirs(os.path.join(root, dir))
  14. shutil.rmtree(os.path.join(root, dir))
  15.  
  16. return 'OK'

脚本用处是删除传入的目录的子目录 添加C#代码

  1.      ScriptRuntime pyRuntime2 = Python.CreateRuntime(); //创建一下运行环境
  2. dynamic obj2 = pyRuntime.UseFile("Python2.py"); //调用一个Python文件
  3. obj2.ClearDirect(@"D:\Data\KkImage\2017"); //
  4. Console.Write("result ");
  5. Console.WriteLine(sum);

运行后,十分抱歉,报错了

  1. IronPython.Runtime.Exceptions.ImportException”类型的未经处理的异常在 Microsoft.Dynamic.dll 中发生
  2.  
  3. 其他信息: No module named os

找不到OS这个模块

7.怎么才能使用OS这个库呢

在python2.py中加入

  1. import sys
  2. sys.path.append("F:\Program Files (x86)\IronPython 2.7\lib")

代码变成

  1. #!/usr/bin/python
  2. # -*- coding: UTF-8 -*-
  3. import sys
  4. sys.path.append("F:\Program Files (x86)\IronPython 2.7\lib")
  5. import os
  6. import shutil
  7.  
  8. def ClearDirect(path):#直接删除
  9.  
  10. for root, dirs, files in os.walk(path,topdown=False):
  11. print 'root',root
  12. for dir in dirs:
  13.  
  14. print 'delete:',os.path.join(root, dir)
  15. #os.removedirs(os.path.join(root, dir))
  16. shutil.rmtree(os.path.join(root, dir))
  17.  
  18. return 'OK'

再次运行,发现子目录删除成功 . 祝贺你.

8.代码继续优化

在上面的python代码中,加了

  1.   sys.path.append("F:\Program Files (x86)\IronPython 2.7\lib")

这在程序发布了的时候,服务器上的路径是会变化的,如果有几十个python文件,难道还要挨个修改这个路径么?想想都恐怖.

所以,可以用下面的方法啦.(先把python文件中的sys.path.append("F:\Program Files (x86)\IronPython 2.7\lib"这句去掉)

  1. ScriptRuntime pyRuntime3 = Python.CreateRuntime(); //创建一下运行环境
  2. var engine = pyRuntime3.GetEngine("python");
  3. var pyScope = engine.CreateScope();
  4. var paths = engine.GetSearchPaths();
  5. paths.Add(@"F:\Program Files (x86)\IronPython 2.7\lib");
  6. engine.SetSearchPaths(paths);
  7. dynamic obj3 = pyRuntime3.UseFile("Python2.py"); //调用一个Python文件
  8. obj3.ClearDirect(@"D:\Data\KkImage\2017"); //

在engine中指定库的位置,就不用每个python文件中指定了

8.代码继续优化

  1. 源码地址:https://download.csdn.net/download/hanghangz/10397609

C#调用Python,报错No module named os的更多相关文章

  1. python报错No module named 'pylab'

    pip instal matplotlib

  2. mac 上python编译报错No module named MySQLdb

    mac 上python编译报错No module named MySQLdb You installed python You did brew install mysql You did expor ...

  3. python踩坑系列之导入包时下划红线及报错“No module named”问题

    python踩坑系列之导入包时下划红线及报错“No module named”问题 使用pycharm编写Python时,自己写了一个包(commontool),在同级另一个路径下(fileshand ...

  4. python manage.py startapp app 时候报错No module named _sqlite3

    python manage.py startapp app 报错如下: File "manage.py", line 10, in <module>    execut ...

  5. 在eclipse中用java调用python报错 Exception in thread "main" ImportError: Cannot import site module and its dependencies

    最近做项目需要用java调用python,配置了jython后,运行了例子代码: 获得一个元组里面的元素: import org.python.util.PythonInterpreter; publ ...

  6. Python 导入requests报错No module named requests

    刚开始是在Pycharm里面,发现就是不对,导入老提示No module named requests这个错误.后面发现是指向的python.exe路径不对,到setting里面设置换一下路径就好.

  7. python django2.x报错No module named 'django.core.urlresolvers'

    解决方法就是: from django.urls import reverse 最近从django1.9迁移到django2.0中出现一个意外的报错: 这个报错的原因在stack overflow上有 ...

  8. Django:django-cors-headers 报错no module named "corsheaders"

    django跨域使用 pip install django-cors-headers 然后在settings文件中加上参数设置 # app配置 INSTALLED_APPS = [ 'django.c ...

  9. salt-minion启动报错No module named salt.scripts

    这是当初部署saltstack时候的问题了,saltstack用的是0.17.4的版本.正当minion部署到最后时候,启动 minion端时报错ImportError: No module name ...

随机推荐

  1. [Bzoj 2547] [Ctsc2002] 玩具兵

    2547: [Ctsc2002]玩具兵 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 317  Solved: 152[Submit][Status] ...

  2. Object的方法

    1.Object.assign() 方法用于将所有可枚举属性的值从一个或多个源对象复制到目标对象.它将返回目标对象. ES2015引入的 ,且可用polyfilled.要支持旧浏览器的话,可用使用jQ ...

  3. memcache 总结笔记

    (一):基础概念 memcache是什么? Memcache 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载.它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态 ...

  4. MYSQL数据库学习十七 日志管理

    17.1 MySQL软件所支持的日志 MySQL所支持的日志文件里,除了二进制日志文件外,其他日志文件都是文本文件.默认情况下,MySQL只会启动错误日志文件,其他日志文件则需要手动启动. 二进制日志 ...

  5. 巧用linux版powershell,管理linux下的docker

    大家好,我把用powershell的docker马甲命令的好处,放在了页面下方,从第五章开始. powershell 传教士 原创文章 始于 2017-09-07 允许转载,但必须保留名字和出处,否则 ...

  6. JSON Web Token - 在Web应用间安全地传递信息

    转载自:http://blog.leapoahead.com/2015/09/06/understanding-jwt/ JSON Web Token(JWT)是一个非常轻巧的规范.这个规范允许我们使 ...

  7. [react 基础篇]——React.createClass()方法同时创建多个组件类

    react 组件 React 允许将代码封装成组件(component),然后像插入普通 HTML 标签一样,在网页中插入这个组件.React.createClass 方法就用于生成一个组件类 一个组 ...

  8. poj1183 反正切函数

    poj1183 反正切函数 第一道poj的题更博,类似于博主这种英文水平,也就切一切这种中文题了吧! 题目大意:给你正整数a,求满足条件的 b 和 c,使得 $\frac {1}{a}=\frac { ...

  9. DotNetCore跨平台~Json动态序列化属性

    回到目录 Json动态序列化属性,主要为了解决一个大实体,在返回前端时根据需要去序列化,如果实体里的某个属性在任务情况下都不序列化,可以添加[JsonIgnore]特性,这种是全局的过滤,但是更多的情 ...

  10. 【Spring系列】Spring mvc整合druid

    一.pom.xml中添加druid依赖 <!-- druid --> <dependency> <groupId>com.alibaba</groupId&g ...