如何为新加载项用户配置 Python Init 路径和 sys 路径语句?大家好,
我正在使用 Application Builder 开发一个集成了 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 ))”。 我不确定是什么原因导致此错误或如何修复它。
如果有人能提供见解或更好地解决这个问题,我将不胜感激。
脚本回复:如何为新的加载项用户配置 Python Init 路径和 sys 路径语句?不,不幸的是。 Term() 仅尝试休息一些全局变量并尝试清理环境,就像它重新开始一样。 技术问题是卸载 Python 共享库,它可能加载的所有共享库都不可行。 因此,如果 Python 初始化不当,或者如果您想初始化不同版本的 Python,则需要重新启动 JMP。
回复:如何为新的加载项用户配置 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 环境吗?
回复:如何为新的加载项用户配置 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 时遇到了一些其他问题。
回复:如何为新的加载项用户配置 Python Init 路径和 sys 路径语句?查看更多...