如何从嵌入式引擎访问IronPython库目录?
我正在将IronPython嵌入C#程序中。我知道我需要使用搜索路径列表调用ScriptEngine.SetSearchPath,以便Python代码可以导入模块。特别是,我必须让它知道标准库模块在哪里,在我的例子中,这些模块在这里:如何从嵌入式引擎访问IronPython库目录?,ironpython,embedding,Ironpython,Embedding,我正在将IronPython嵌入C#程序中。我知道我需要使用搜索路径列表调用ScriptEngine.SetSearchPath,以便Python代码可以导入模块。特别是,我必须让它知道标准库模块在哪里,在我的例子中,这些模块在这里: C:\Program Files (x86)\IronPython 2.0.2\Lib 我的问题是,如何通过编程找到这条路径 这显然是可以做到的,因为IronPython控制台知道这一点: >>> import sys >>>
C:\Program Files (x86)\IronPython 2.0.2\Lib
我的问题是,如何通过编程找到这条路径
这显然是可以做到的,因为IronPython控制台知道这一点:
>>> import sys
>>> sys.path
['C:\\Windows\\system32', 'C:\\Program Files (x86)\\IronPython 2.0.2\\Lib', 'C:\\Program Files (x86)\\IronPython 2.0.2', 'C:\\Program Files (x86)\\IronPython 2.0.2\\lib\\site-packages']
试试看:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{80B8E2FB-A8AB-4CBF-836A-B43DE3B3C3F6}\InstallLocation
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{80B8E2FB-A8AB-4CBF-836A-B43DE3B3C3F6}\InstallLocation
GUID应该是相同的(我认为,至少对于同一版本的IronPython来说是相同的),所以您应该可以使用它。这将为您提供安装目录,然后您只需附加
@“\Lib”
ipy.exe即可根据启动进程的exe计算:
Assembly entryAssembly = Assembly.GetEntryAssembly();
// Can be null if called from unmanaged code (VS integration scenario)
if (entryAssembly != null) {
string entry = Path.GetDirectoryName(entryAssembly.Location);
string lib = Path.Combine(entry, "Lib");
...
您也可以查看IronPython.dll的位置:
Assembly entryAssembly = typeof(Hosting.Python).Assembly;
一个可能的解决方案是将Lib文件夹的副本与应用程序一起提供。我相信IronPython许可证()和Python许可证()都会允许这样做 本计划的好处:
[TestMethod()]
[DeploymentItem(@"3rdParty\IronPython\IronPython2.0.2\Lib", @"IronPython\Lib")]
public void MyTest()
{
// ...
创建一个环境变量,并从IronPython访问该环境变量。这应该是最简单的方法。我认为这行不通,因为IronPython程序集将位于我的应用程序文件夹中。这给了我一个想法。。。(我会写出来。)你是否建议OP在每次IronPython版本更改时都更改他的代码?
var assemblyPath = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
var libPath = Path.Combine(assemblyPath, @"IronPython\Lib");
[TestMethod()]
[DeploymentItem(@"3rdParty\IronPython\IronPython2.0.2\Lib", @"IronPython\Lib")]
public void MyTest()
{
// ...