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

python 3: How to source a bash script and run it in same shell

我正在尝试获取具有功能的 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

来自Popen参考:

On POSIX with shell=True, the shell defaults to /bin/sh. If args is a string, the string specifies the command to execute through the shell. This means that the string must be formatted exactly as it would be when typed at the shell prompt. This includes, for example, quoting or backslash escaping filenames with spaces in them.

所以您传递的内容必须作为单个 shell 命令传递。

当我 运行 你的单 POSIX shell 命令在我的 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没有什么特别的。

您收到此错误是因为此命令相当于:

  • 原POSIXshell新建bashshell进程
    • 新 bash shell 来源 abc.sh
    • 命令 abc 现在可以在新的 bash shell
    • 中使用
    • 新建bashshell终止
  • 原来POSIXshell尝试使用命令abc
  • 原POSIXshell终止

您想做的是:

  • 原POSIXshell新建bashshell进程
    • 新 bash shell 来源 abc.sh
    • 命令 abc 现在可以在新的 bash shell
    • 中使用
    • 新 bash shell 尝试使用命令 abc
    • 新建bashshell终止
  • 原POSIXshell终止

因此您需要在同一个 shell 中使用以下 2 个命令:

source ~/abc.sh
abc arg1 arg2 arg3 arg4a

即:

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

(注意单引号在哪里。)

在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)