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.7\Platforms\Net40下的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:\Data\KkImage\2017"); //
        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.7\lib")    

 

代碼變成

#!/usr/bin/python
# -*- coding: UTF-8 -*-
import sys
sys.path.append("F:\Program Files (x86)\IronPython 2.7\lib")
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.7\lib")

這在程序發布了的時候,服務器上的路徑是會變化的,如果有幾十個python文件,難道還要挨個修改這個路徑么?想想都恐怖.

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

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.7\lib");
            engine.SetSearchPaths(paths);
            dynamic obj3 = pyRuntime3.UseFile("Python2.py"); //調用一個Python文件
            obj3.ClearDirect(@"D:\Data\KkImage\2017"); //

 

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

8.代碼繼續優化


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM