• C#调用Python,报错No module named os


    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.7PlatformsNet40下的IronPython.dll和Microsoft.Scripting.dll

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

    def add(num1,num2):
        return num1+num2;

    5.在CSharpCallPython添加代码

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

    运行结果Sum=3

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

    6.如何引用第三方库

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

    #!/usr/bin/python
    # -*- coding: UTF-8 -*-
    import os
    import shutil
    
    
    def ClearDirect(path):#
    
        for root, dirs, files in os.walk(path,topdown=False):
            print 'root',root
            for dir in dirs:
    
                print 'delete:',os.path.join(root, dir)
                #os.removedirs(os.path.join(root, dir))
                shutil.rmtree(os.path.join(root, dir))
    
    
        return 'OK'

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

         ScriptRuntime pyRuntime2 = Python.CreateRuntime(); //创建一下运行环境
            dynamic obj2 = pyRuntime.UseFile("Python2.py"); //调用一个Python文件
            obj2.ClearDirect(@"D:DataKkImage2017"); //
            Console.Write("result ");
            Console.WriteLine(sum);  

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

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

    找不到OS这个模块

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

    在python2.py中加入

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

    代码变成

    #!/usr/bin/python
    # -*- coding: UTF-8 -*-
    import sys
    sys.path.append("F:Program Files (x86)IronPython 2.7lib")
    import os
    import shutil
    
    
    def ClearDirect(path):#直接删除
    
        for root, dirs, files in os.walk(path,topdown=False):
            print 'root',root
            for dir in dirs:
    
                print 'delete:',os.path.join(root, dir)
                #os.removedirs(os.path.join(root, dir))
                shutil.rmtree(os.path.join(root, dir))
    
    
        return 'OK'

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

    8.代码继续优化

    在上面的python代码中,加了

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

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

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

    ScriptRuntime pyRuntime3 = Python.CreateRuntime(); //创建一下运行环境
                var engine = pyRuntime3.GetEngine("python");
                var pyScope = engine.CreateScope();
                var paths = engine.GetSearchPaths();
                paths.Add(@"F:Program Files (x86)IronPython 2.7lib");
                engine.SetSearchPaths(paths);
                dynamic obj3 = pyRuntime3.UseFile("Python2.py"); //调用一个Python文件
                obj3.ClearDirect(@"D:DataKkImage2017"); //

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

    8.代码继续优化


    源码地址:https://download.csdn.net/download/hanghangz/10397609
  • 相关阅读:
    年轻人绝对不懂的人际关系经验
    MRCPv2在电信智能语音识别业务中的应用
    S3 介绍
    RGW 学习 前言
    CEPH 自动化测试用例介绍
    CentOS7使用yum安装ceph rpm包
    Placement_pools on Rados-GW
    ceph log机制
    bucket list 函数解析
    ceph 初始化函数解析
  • 原文地址:https://www.cnblogs.com/birds-zhu/p/8821020.html
Copyright © 2020-2023  润新知