我在一个C#程序中嵌入了IronPython。我知道我需要使用搜索路径列表调用ScriptEngine.SetSearchPaths,以便我的Python代码可以导入模块。特别是我必须让它知道标准库模块的位置,在我的例子中是这样的:
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']
答案 0 :(得分:2)
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;
答案 1 :(得分:2)
可能的解决方案是将Lib文件夹的副本与您的应用程序一起发送。我相信IronPython许可证(Microsoft Public License (Ms-PL))和Python许可证(Python License)都允许这样做。
此计划的好处:
应用程序很容易找到Lib文件夹。
安装将更容易,因为将减少一个安装程序来处理。
安装程序的总大小会更小。
如果应用程序使用的IronPython程序集在本地复制,那么复制Lib也是有意义的,这样两者就不会像使用程序文件中的Lib一样不同步
许可证似乎没有施加任何繁重的义务。 Ms-PL确实要求您在发行版中包含Ms-PL的完整副本,但这不是什么大问题。
编辑:这是代码
以下是我的所作所为。
Lib文件夹被复制到我的.csproj文件的AfterBuild目标中。我无法弄清楚如何使用内置的MSBuild复制命令,因为与MSBuild有关的一切都是为了最大的痛苦,所以我使用了robocopy。 (robocopy是xcopy的替代品;你可以使用xcopy代替)。
<Target Name="AfterBuild">
<Exec Command="robocopy $(ProjectDir)..\3rdParty\IronPython\IronPython2.0.2\Lib $(OutputPath)IronPython\Lib /E /XD .svn" IgnoreExitCode="true" />
<Exec Command="copy $(ProjectDir)..\3rdParty\IronPython\IronPython2.0.2\license.* $(OutputPath)IronPython\" />
</Target>
它复制许可证文件(根据许可证的要求),它不包括subversion文件夹(.svn)。
“3rdParty”文件夹位于Visual Studio解决方案的根级别。这是我保留第三方图书馆的地方。
我忽略了robocopy的退出代码,因为<Exec>
无法处理robocopy的退出代码。这并不理想,但我认为下一行中的普通副本会发现任何问题。
这就是我在代码中找到Lib路径的方法:
var assemblyPath = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
var libPath = Path.Combine(assemblyPath, @"IronPython\Lib");
要在单元测试中复制Lib,请执行以下操作:
[TestMethod()]
[DeploymentItem(@"3rdParty\IronPython\IronPython2.0.2\Lib", @"IronPython\Lib")]
public void MyTest()
{
// ...
答案 2 :(得分:1)
试着看看:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{80B8E2FB-A8AB-4CBF-836A-B43DE3B3C3F6}\InstallLocation
GUID应该是相同的(我认为,至少对于相同版本的IronPython而言),所以你应该没问题。这将为您提供安装目录,然后您可以添加@"\Lib"
答案 3 :(得分:0)
创建一个环境变量,并从IronPython访问该环境变量。这应该是最简单的方法。