1

所以我是 Python 新手,我在 Visual Studio 中使用 IronPython。

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

因此,在使用 IronPython 的 C# 中,可以使用以下命令执行 Python 脚本

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

在我的 Python SCript 中,我得到了以下代码:

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

所以我想知道是否可以为变量路径传递一个参数,所以 sys.path.append(path) 将随着给定的参数而改变并且库被正确导入。

4

2 回答 2

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# 程序中,无论是什么合适的。这个答案有前两个的例子。(他们设置的是PYTHONPATH,它会影响 CPython,而不是IRONPYTHONPATH,它会影响 IronPython,但应该很明显要改变什么。)

如果这不起作用,您可以手动执行相同的操作:

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

现在,您可以设置该MY_IRONPYTHON_EXTRA_PATH环境变量而不是IRONPYTHON_PATH.

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

paths = os.environ['MY_IRONPYTHON_EXTRA_PATH'].split(';')
sys.path.extend(paths)
于 2013-01-04T09:00:52.297 回答
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 的网络中工作,这非常好

于 2013-01-04T13:38:44.560 回答