unix python 3:如何获取bash脚本并在同一shell中运行它

0qx6xfy6  于 2022-11-04  发布在  Unix
关注(0)|答案(1)|浏览(220)

我正在尝试一个源shell脚本有函数。而不是试图执行它像下面。

source ~/abc.sh; abc arg1 arg2 arg3 arg4a

它在unix shell中工作。但是当我试图从python脚本内部执行相同的命令时,它会出现错误

def subprocess_cmd(command):
        process = subprocess.Popen(command, stdout=subprocess.PIPE, shell=True)
        proc_stdout = process.communicate()[0].strip()
        return proc_stdout
    command = "bash -c source ~/abc.sh; abc arg1 arg2 arg3 arg4a"
    out = subprocess_cmd(command)
    print(out)

当我执行上面的python代码时,它给出了下面的错误。

~/abc.sh: line 0: source: filename argument required
source: usage: source filename [arguments]
/bin/sh: line 1: abc: command not found
zvokhttg

zvokhttg1#

来自Popen参考:
在shell=True的POSIX上,shell默认为/bin/sh。如果args是一个字符串,则该字符串指定要通过shell执行的命令。这意味着该字符串的格式必须与在shell提示符下键入时的格式完全相同。例如,这包括引号或反斜杠转义带有空格的文件名。
所以你传递的命令必须作为一个shell命令传递。
当我在shell中运行单个POSIX shell命令时:

$ bash -c source ~/abc.sh; abc arg1 arg2 arg3 arg4a
~/abc.sh: line 0: source: filename argument required
source: usage: source filename [arguments]
bash: abc: command not found

所以这里的python没什么特别的。
出现此错误的原因是此命令相当于:

  • 原始POSIX shell创建新的bash shell进程
  • 新的bash shell源代码abc.sh
  • 命令abc现在可在新的bash shell中使用
  • 新的bash shell终止
  • 原始POSIX shell尝试使用命令abc
  • 原始POSIX shell终止

您要做的是:

  • 原始POSIX shell创建新的bash shell进程
  • 新的bash shell源代码abc.sh
  • 命令abc现在可在新的bash shell中使用
  • 新的bash shell尝试使用命令abc
  • 新的bash shell终止
  • 原始POSIX shell终止

因此,您希望在同一shell中使用以下两个命令:

source ~/abc.sh
abc arg1 arg2 arg3 arg4a

即:

bash -c 'source ~/abc.sh; abc arg1 arg2 arg3 arg4a'

(note单引号所在的位置。)
Python皮:

def subprocess_cmd(command):
    process = subprocess.Popen(command, stdout=subprocess.PIPE, shell=True)
    proc_stdout = process.communicate()[0].strip()
    return proc_stdout
command = "bash -c 'source ~/abc.sh; abc arg1 arg2 arg3 arg4a'"
out = subprocess_cmd(command)
print(out)

相关问题