2013-01-04 35 views
1

所以我是Python的新手,我在Visual Studio中使用IronPython。通过C#导入Python图书馆?

所以在我的C#项目中,我调用Python脚本来执行一些任务。 现在我在一家更大的公司工作,所以很多文件路径等都不同。 我想知道是否有可能将Python文件传递给路径,然后从此路径导入模块(例如urlib) 。

所以在C#与IronPython的它可能与

var ipy = Python.CreateRuntime(); 
dynamic PYthon_Script = ipy.UseFile("test.py"); 

而且在我的Python脚本来执行Python脚本我有下面的代码:

import sys 
path = "C:\Program Files (x86)\IronPython 2.7\Lib" 
sys.path.append(path) 
import urllib 
import httplib 
... 

所以我在想,如果有可能传递可变路径的参数 ,以便sys.path.append(路径)将随给定参数而变化,并且正确导入库 。

+0

您是否可以检查http://stackoverflow.com/questions/4852386/ironpython-dlr-passing-parameters-to-compiled-code问题如果是你想要的吗? –

回答

1

你只是想传递一个参数给脚本?当然,这很容易。

做到这一点的主要方法是使用sys.argv

import sys 
path = sys.argv[1] 
sys.path.append(path) 
import urllib 
import httplib 

然后,而不是这样做:

py.exe myscript.py 

你这样做:

py.exe myscript.py "C:\Program Files (x86)\IronPython 2.7\Lib" 

如果你直接从.NET启动程序运行这个程序,你也可以动态地插入变量:

PYthon_Script.SetVariable("path", "C:\Program Files (x86)\IronPython 2.7\Lib") 

然后,从脚本内部,您可以使用该变量。

或者您甚至可以从启动器修改sys.path本身。有关详细信息,请参阅Runtime文档。

如果要添加多个路径,只是改变这两条线:

paths = sys.argv[1:] 
sys.path.extend(paths) 

如果你想要的东西,粘在你的环境周围,这样你就不必每次都通过它,那是什么环境变量是。

实际上有一个名为IRONPYTHONPATH的标准环境变量,应该可以工作,而无需执行任何操作。我从来没有用过它,但如果它有效,你根本不需要在代码中做任何明确的操作。只需将它设置在您的控制面板中的cmd.exe外壳程序中,在您正在启动myscript.py的C#程序中,然后从适当的地方进行设置。前两个例子是This answer。 (他们正在设置PYTHONPATH,这会影响CPython,而不是影响IronPython的IRONPYTHONPATH,但显然应该改变。)

如果不工作,你可以做手工同样的事情:

import os 
import sys 
path = os.environ['MY_IRONPYTHON_EXTRA_PATH'] 
sys.path.append(path) 
import urllib 
import httplib 

现在,你可以设置的,而不是IRONPYTHON_PATHMY_IRONPYTHON_EXTRA_PATH环境变量。

在这里,因为你只是一个字符串而不是一个列表,所以如果你想指定多个路径,你需要添加一个分隔符。 Windows上的标准路径分隔符是分号。所以:

paths = os.environ['MY_IRONPYTHON_EXTRA_PATH'].split(';') 
sys.path.extend(paths) 
0

我在[TestMethod]项目中发现了一种方法,没有控制台I/O只用C#命令。

C#代码去如下:

IDictionary<string, object> options = new Dictionary<string, object>(); 
options["Arguments"] = new [] {"C:\Program Files (x86)\IronPython 2.7\Lib", "bar"}; 

var ipy = Python.CreateRuntime(options); 
dynamic Python_File = ipy.UseFile("test.py"); 

Python_File.MethodCall("test"); 

所以基本上我提交字典与我想在我的Python文件来定义库路径。

所以python脚本如下所示:

#!/usr/bin/python 

import sys 
path = sys.argv[0] #1 argument given is a string for the path 
sys.path.append(path) 
import httplib 
import urllib 
import string 

def MethodCall(OutputString): 
    print Outputstring 

所以方法调用现在是从C#更容易和参数传递保持不变。此外,通过此代码,您可以获得用于Python文件的自定义库文件夹,如果您在具有许多不同PC的网络中工作,该文件夹是非常好的