我在Azure上托管了一个现有的.NET Core / asp.net应用程序服务。我需要调用(按需)python脚本以基于自定义用户输入返回数据。
似乎无法使用IronPython,因为我需要CPython内置的python模块,不幸的是IronPython不支持这些模块。
我看到的两个选项是:
我也许能够在应用程序服务上安装正确的python版本和库,然后从.NET代码中调用它。似乎已弃用:https://docs.microsoft.com/en-us/visualstudio/python/publishing-python-web-applications-to-azure-from-visual-studio?view=vs-2017
我可以只为python脚本创建一个全新的单独的应用程序服务,并根据需要从.NET应用程序服务中将其作为REST API调用。这似乎有些矫kill过正,并引入了我不想做的公开开放全新服务的问题。这似乎也具有Flask不适用于生产的局限性,因此一次承载多个呼叫实际上是行不通的。 https://docs.microsoft.com/en-us/visualstudio/python/publish-to-app-service-windows?view=vs-2017
从Azure上的.NET应用服务按需调用python脚本的最佳方法是什么?
答案 0 :(得分:0)
根据我的经验,有两种方法可以在不使用IronPython的情况下使用C#调用Python脚本。
在C#中直接使用System.Diagnostics.Process
来运行与SO线程Run Command Prompt Commands相同的命令,以通过解析过程标准输出的内容来获取结果。只需执行此操作,就可以使用py2exe
将Python脚本包装为.exe
文件,以避免在Azure App Service上安装Python模块和设置环境变量。但是,考虑到并发性,这不是提高性能的好主意。
您所说的第二个选项是在同一Azure Web App实例中将Python脚本部署为REST API。您可以关注Deploying multiple virtual directories to a single Azure Website
博客,通过带有PTVS
的Visual Studio通过子项目部署带有Python脚本的flask应用程序作为子项目,以公开可以从ASP调用的API网址,例如https://<your web app name>.azurewebsites.net/pyapi
。 .NET通过HttpClient
。我尝试过这种解决方案,它可以工作。
注意:由于Local Address Requests
的Azure Web App沙箱的限制,您必须使用<your web app name>.azurewebsites.net
作为主机名,而不能同时使用localhost
或127.0.0.1
。