我尝试在Powershell for Linux中调用.ps1脚本,方法是传递变量并触发它以响应对Flask / Python API的Web调用。
此示例中的所有文件都在同一目录中 - 理想情况下,.ps1脚本和其需要执行的操作的其他相关文件将位于另一个目录中,但为了进行测试,它们全部位于主目录中我的目录。
如果我通过my_venv >> python script.py
# this is script.py
import subprocess
arg1 = 'xyz'
arg2 = 'abc'
subprocess.run(['pwsh', '.\example.ps1', arg1, arg2])
它会正常工作。 Powershell将运行,脚本example.ps1
中的操作将执行。但是,如果我将相同的Python代码添加到Flask应用程序路由中,那么它可以由API请求触发,如下所示:
from flask import Flask, request
import subprocess
app = Flask(__name__)
app.debug = True
# example route
@app.route('/example/', methods=['GET'])
def example():
var1 = request.args.get('var1')
arg1 = var1
arg2 = 'abc'
subprocess.run(['pwsh', '.\example.ps1', arg1, arg2])
return ('success', 200)
它没有做任何事情。 Flask调试给出了错误:
Exception: builtins.FileNotFoundError: [Errno 2] No such file or directory: 'pwsh'
这让我觉得它没有找到pwsh
的二进制文件,但我不清楚在这种情况下如何解决这个问题。在Windows中,您可以在命令中输入powershell.exe可执行文件的路径,但这显然不是它在这里的工作方式。
一个注释是上面的变量 - 我已经尝试过了,只是让值通过var1
传递给GET
,然后忽略它并硬编码arg1
进行测试,没有区别。真正的代码确实需要变量。
我在这里做错了任何明显的愚蠢行为?虽然有一些类似的Windows问题,但似乎没有人要求Linux提出这个问题。
答案 0 :(得分:1)
在Windows中,如果您不确定环境变量,那么通常最佳做法是完全路径您的可执行文件和参数。您可以使用
在示例中完成此操作subprocess.run(['/usr/bin/pwsh', '.\example.ps1', arg1, arg2])
完全限定Linux中的pwsh可执行文件路径。