Python - 在subprocess.call语法

时间:2018-05-08 21:33:31

标签: python flask subprocess

我有一些需要调用.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脚本。

1 个答案:

答案 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