我有一些需要调用.sh脚本的Python代码,该脚本位于不同的目录中,并将几个变量传递给它。它位于.py文件中,它是API的Flask路径的一部分。
subprocess.call(shlex.split('script_name.sh {} {}'.format(var1,var2)))
如果我将代码复制到单独的.py文件并在我位于.py文件所在的目录中直接从venv运行它并且我在该文件中包含os.chdir行时,它可以工作:
os.chdir('/path/to/sh_script_dir')
如果我进入.sh脚本所在的目录并使用
直接调用它>> python /path/to/py_file.py
在后一种情况下,不需要os.chdir。但是,当我从Flask调用它时(通过点击它的API路径,就像一个“真正的”用户),我得到:
Exception class: builtins.FileNotFoundError
Exception message: [Errno 2] No such file or directory: 'script_name.sh'
无论我是否定义该行中脚本的绝对路径,都会发生此错误。
我认为这是因为它是从主要的Flask api.py调用的ultimatley,它位于它所在的任何工作目录中,它忽略了os.chdir命令。
我知道还有另一种方法可以做到这一点,“cwd”但是我无法让它发挥作用。我在下面尝试了很多变化,但没有任何作用:
subprocess.call(shlex.split('script_name.sh {} {}'.format(var1,var2), cwd = '/path/to/sh_script_dir'))
subprocess.call(shlex.split('script_name.sh {} {}'.format(var1,var2)), cwd = '/path/to/sh_script_dir')
subprocess.call([shlex.split('script_name.sh {} {}'.format(var1,var2))], cwd = '/path/to/sh_script_dir')
subprocess.call([shlex.split('script_name.sh {} {}'.format(var1,var2)], cwd = '/path/to/sh_script_dir'))
我是否需要在Flask路线中将工作目录中的更改定义为一级?旁注是我不完全确定这里需要shlex.split,但没有它就行不通,然后就行了,所以我离开了。我可以提供更多代码/信息,但问题似乎非常具体到让这个函数运行,好像当前工作目录是.sh脚本所在的位置,而不是.py脚本。
答案 0 :(得分:1)
我怀疑如果./
没有传递给subprocess
,在某些系统上可能找不到该命令(安全问题,.
不在系统路径)
另一个问题可能是目录中没有真正错误的目录/命令。
显然我无法对此进行测试,但这是一种安全的方式(并且通过错误检查)来执行目录中的命令,因此它应该解决您的问题,或者至少查明路径问题:
command_dir = '/path/to/sh_script_dir'
command_file = os.path.join(command_dir,"script_name.sh")
if not os.path.isfile(command_file):
raise Exception("{}: no such file".format(command_file))
subprocess.call([command_file,var1,var2], cwd = command_dir)
shlex.split