新しいアドイン ユーザー向けに Python Init パスと sys パス ステートメントを構成するにはどうすればよいですか?こんにちは、みんな、
アプリケーションビルダーを使用して、Python 統合を備えたアプリケーションを開発しています。 これを他のユーザーと共有できるようにアドインにコンパイルする予定ですが、すべてのユーザーに対して Python の初期化を正しく設定する方法が必要です。
私がアプリケーションを実行してきた方法は、私にとってのみ機能します (ユーザー EstelleS1 と私の環境、 JMPPython環境) :
appNS:PythonPathText = "C:\Users\EstelleS1\AppData\Local\Programs\Python\Python37\JMPPythonEnvironment\Scripts\python37.dll";
appNS:PythonSysPathText = {"",
"C:\\Users\\EstelleS1\\AppData\\Local\\Programs\\Python\\Python37\\JMPPythonEnvironment\\Scripts\\python37.zip",
"C:\\Users\\EstelleS1\\AppData\\Local\\Programs\\Python\\Python37\\DLLs",
"C:\\Users\\EstelleS1\\AppData\\Local\\Programs\\Python\\Python37\\lib",
"C:\\Users\\EstelleS1\\AppData\\Local\\Programs\\Python\\Python37",
"C:\\Users\\EstelleS1\\AppData\\Local\\Programs\\Python\\Python37\\JMPPythonEnvironment",
"C:\\Users\\EstelleS1\\AppData\\Local\\Programs\\Python\\Python37\\JMPPythonEnvironment\\lib\\site-packages"};
Python Init(
Path( PythonPathText ),
Python Sys Path( PythonSysPathText )
);(appNS は私のアプリケーションの名前空間を指します)
他のユーザーは多くの管理者権限を持っているため、新しいユーザーがアプリランチャーのボタンをクリックしてPythonパスとsysパス文字列を含むテキストファイルをアップロードし、アプリケーションがそれらを取得するワークフローを設定することを考えていました。ファイルを作成し、コピーを新しいフォルダーに保存します ($DESKTOP は、すべてのユーザーのコンピューター上でアクセス可能な場所である必要があります)。
PythonPathButtonPress=Function({this},
// This function is called when the button is pressed
name = this << Get Button Name;
pickPythonPathFile = Pick File("Please select Python Path text file");
pickPythonSysPathFile = Pick File("Please select Python Sys Path text file");
PythonPathFile = Load Text File( pickPythonPathFile );
PythonSysPathFile = Load Text File( pickPythonSysPathFile );
PythonConfigFolder = ( "$DESKTOP/JMPPython Config/" );
NEWPythonPathFile = (PythonConfigFolder || "PythonPath.txt" );
NEWPythonSysPathFile = (PythonConfigFolder || "PythonSysPath.txt" );
PythonConfigDir = Create Directory( PythonConfigFolder );
Save Text File( NEWPythonPathFile, PythonPathFile );
Save Text File( NEWPythonSysPathFile, PythonSysPathFile );
);したがって、これを初めて実行した後、ユーザーはボタンをクリックして Python を再度構成する必要はありません。 そして、アドインの Python 統合部分を実行すると、アプリケーションは自動的に検索して、アクセス可能なフォルダーの場所 ($DESKTOP またはその他の場所) にあるこれらのコピーされたファイルを開きます。
PythonPathFile = Convert File Path( "$DESKTOP\JMPPython Config\PythonPath.txt", search );
PythonSysPathFile = Convert File Path( "$DESKTOP\JMPPython Config\PythonSysPath.txt", search );
Try( appNS:PythonPathText = Load Text File( PythonPathFile ), New Window("Python Initialization Error", << Modal, Text Box("Need to configure Python first!") ); Throw() );
Try( appNS:PythonSysPathText = Load Text File( PythonSysPathFile ), New Window("Python Initialization Error", << Modal, Text Box("Need to configure Python first!") ); Throw() );
Python Init(
Path( PythonPathText ),
Python Sys Path( PythonSysPathText )
);しかし、これはうまくいきませんでした。 「指定されたモジュールが見つかりませんでした。 'Python Init' 、Python Init/*###*/(Path( PythonPathText )、Python Sys Path( PythonSysPathText )) へのアクセスまたは評価で」というエラーが発生しました。 このエラーの原因や修正方法が正確にわかりません。
誰かがこの問題に対する洞察やより良い解決策を提供できれば幸いです。
スクリプト作成Re: 新しいアドイン ユーザー向けに Python Init パスと sys パス ステートメントを構成するにはどうすればよいですか?いいえ、残念ながら。 Term() は、いくつかのグローバル変数を保存し、新しく開始されたかのように環境をクリーンアップしようとするだけです。 技術的な問題は、Python 共有ライブラリをアンロードすることであり、ロードされる可能性のあるすべての共有ライブラリをアンロードすることは不可能です。 したがって、Python が正しく初期化されていない場合、または Python の別のバージョンを初期化したい場合は、JMP を再起動する必要があります。
Re: 新しいアドイン ユーザー向けに Python Init パスと sys パス ステートメントを構成するにはどうすればよいですか?実は、これを行う別の方法を考え出しました。
PythonSysPathFile = Convert File Path( "$DESKTOP\JMPPython Config\PythonSysPath.txt", search );
PythonSysPathText = Load Text File( PythonSysPathFile );
PythonSysPathList = {""};
NListItems = NItems(Eval List(Words(PythonSysPathText, "\!N"))) + 1;
For( i = 1, i < NListItems, i++,
string = Word(i, PythonSysPathText, "\!N");
Insert Into(PythonSysPathList, string)
);
Python Init(
Path( PythonPathText ),
Python Sys Path( PythonSysPathList )
);
version = Python Get Version();
Show( version );
そして、sys パス リストが正しく設定され、Python が開始されます...しかし、今度は仮想環境が認識されません!...
-------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- ------
編集: Python Term() は私が思ったように機能しないと思います。 初めてスクリプトを実行するときに Python を正しく開始し、後で初期化コードを台無しにしても、最初の正しい初期化に基づいて引き続き正常に実行され、その逆も同様のようです。 この初期化コードが機能していることを実際に確認するには、JMP を完全に閉じて再度開く必要がありました。ここに投稿した質問のトラブルシューティング中に最初に行った、間違った初期化試行を使用したままになってしまいました。
Python Term() は実際には初期化された Python 環境を終了しないのでしょうか?
Re: 新しいアドイン ユーザー向けに Python Init パスと sys パス ステートメントを構成するにはどうすればよいですか?返信いただきありがとうございます! そんな問題あったんですね… テキスト ファイル内の DLL へのファイル ディレクトリ パスを引用符なし (空白行なし) にするだけで、Python パスが適切に動作するようになったと思います。
これで、Python コードの一部が実行されるようになりますが、まだ問題が発生しており、おそらく Python の sys パス引数に問題があると考えられます。 テキスト ファイルに読み込むにはエスケープ文字を使用する必要があると思いますが、まだよく理解していません... いくつかのことをテストしてみましたが、適切な解決策が見つかりませんでした。
これは、テキスト ファイルに sys パスを含める正しい方法でしょうか?
-------------------------------------------------- -------------------------------------------------- --------------------
{""、
"C:\\Users\\EstelleS1\\AppData\\Local\\Programs\\Python\\Python37\\JMPPythonEnvironment\\Scripts\\python37.zip",
"C:\\Users\\EstelleS1\\AppData\\Local\\Programs\\Python\\Python37\\DLLs",
"C:\\Users\\EstelleS1\\AppData\\Local\\Programs\\Python\\Python37\\lib",
"C:\\Users\\EstelleS1\\AppData\\Local\\Programs\\Python\\Python37",
"C:\\Users\\EstelleS1\\AppData\\Local\\Programs\\Python\\Python37\\JMPPythonEnvironment",
"C:\\Users\\EstelleS1\\AppData\\Local\\Programs\\Python\\Python37\\JMPPythonEnvironment\\lib\\site-packages"}
-------------------------------------------------- -------------------------------------------------- --------------------
これを JMP にロードして Show() を使用すると、ログが次のように出力されます。
PythonSysPathText = "{\!"\!",
\!"C:\\Users\\EstelleS1\\AppData\\Local\\Programs\\Python\\Python37\\JMPPythonEnvironment\\Scripts\\python37.zip\!",
\!"C:\\Users\\EstelleS1\\AppData\\Local\\Programs\\Python\\Python37\\DLLs\!",
\!"C:\\Users\\EstelleS1\\AppData\\Local\\Programs\\Python\\Python37\\lib\!",
\!"C:\\Users\\EstelleS1\\AppData\\Local\\Programs\\Python\\Python37\!",
\!"C:\\Users\\EstelleS1\\AppData\\Local\\Programs\\Python\\Python37\\JMPPythonEnvironment\!",
\!"C:\\Users\\EstelleS1\\AppData\\Local\\Programs\\Python\\Python37\\JMPPythonEnvironment\\lib\\site-packages\!"}";これは正しいです? 「はい」の場合、Python Init に別の問題が発生しています。
Re: 新しいアドイン ユーザー向けに Python Init パスと sys パス ステートメントを構成するにはどうすればよいですか?もっと見る...