2

私はC#プログラムにIronPythonを埋め込んでいます。Pythonコードがモジュールをインポートできるように、検索パスのリストを使用してScriptEngine.SetSearchPathsを呼び出す必要があることを理解しています。特に、標準ライブラリモジュールがどこにあるかを知らせる必要があります。私の場合は次のとおりです。

C:\Program Files (x86)\IronPython 2.0.2\Lib

私の質問は、そのパスをプログラムでどのように見つけることができるかということです。

IronPython Consoleがそれを知っているので、明らかにそれを行うことができます。

>>> 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'] 
4

4 に答える 4

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;
于 2009-09-09T02:41:13.180 に答える
2

考えられる解決策は、Libフォルダーのコピーをアプリケーションと一緒に出荷することです。IronPythonライセンス(Microsoft Public License(Ms-PL))とPythonライセンス(Python License)の両方でこれが許可されると思います。

このプランのメリット:

  1. アプリがLibフォルダーを見つけるのは簡単です。

  2. 処理するインストーラーが1つ少なくなるため、インストールが簡単になります。

  3. インストーラーの合計サイズは小さくなります。

  4. アプリが使用するIronPythonアセンブリがローカルにコピーされる場合は、Libもコピーするのが理にかなっています。これにより、プログラムファイルからのLibが使用された場合のように2つが同期しなくなります。

ライセンスは面倒な義務を課しているようには見えません。Ms-PLでは、ディストリビューションにMs-PLの完全なコピーを含める必要がありますが、それは大したことではありません。

編集:これがコードです

以下は私がしたことです。

Libフォルダーは、私の.csprojファイルのAfterBuildターゲットにコピーされます。組み込みのMSBuildcopyコマンドの使用方法を理解できませんでした。これは、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」フォルダーは、私のVisualStudioソリューションのルートレベルにあります。それは私がサードパーティのライブラリを保持する場所です。

<Exec>robocopyの終了コードを処理できないため、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()
{
    // ...
于 2009-09-09T12:33:38.297 に答える
1

見てみてください:

HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows \ CurrentVersion \ Uninstall \ {80B8E2FB-A8AB-4CBF-836A-B43DE3B3C3F6} \ InstallLocation

GUIDは同じである必要があるため(少なくとも同じバージョンのIronPythonの場合)、問題はないはずです。これにより、インストールディレクトリが表示されます。その後、追加するだけです。@"\Lib"

于 2009-09-08T06:30:41.463 に答える
0

環境変数を作成し、IronPythonからその環境変数にアクセスします。これは、それを行うための最も簡単な方法です。

于 2011-08-17T15:57:03.813 に答える