【问题标题】:Pass file paths from Python to shell script将文件路径从 Python 传递到 shell 脚本
【发布时间】:2020-10-06 07:19:40
【问题描述】:

我想在 Linux 中从 Python 3 运行一个 shell 脚本,传递两个包含两个不同文件的文件路径的参数。然后,shell 脚本调用一个用 Python 2 编写的程序。

在 Python 3 中,我这样调用 shell 脚本:

import os
import sys    
os.chmod('/path/to/sh', 0o777)
subprocess.call(['/path/to/sh', '/path/to/file1', '/path/to/file2'], shell=True)

我的 shell 脚本如下所示:

#!/bin/sh
set -x
path1=$1
path2=$2
python2 path/to/programme "$path1" "$path2"

现在,文件路径为空,shell 脚本返回类似python2 path/to/programme '' '' 的内容。有人知道我如何正确传递文件路径以便用 Python 2 编写的程序可以读取它们吗?

或者有没有更简单的解决方案,比如使用 subprocess 直接调用 Python 2 编写的程序?

【问题讨论】:

  • 直接删除shell=True。您已经提供了一个单独的字符串列表,这些字符串足以满足exec* 将使用的相应系统级函数subprocess 的要求。

标签: python subprocess arguments sh filepath


【解决方案1】:

不需要 shell 脚本。您可以使用subprocess 直接运行python2

a.py

#!/usr/bin/env python3

import subprocess

subprocess.call(['python2', './b.py', 'foo', 'bar'])

b.py

#!/usr/bin/env python2

import sys

print sys.argv

运行./a.py 输出['./b.py', 'foo', 'bar']

您也可以尝试改用past.translation

过去的模块提供了一个实验性的翻译包,以帮助在 Python 3 环境中导入和使用旧的 Python 2 模块。

【讨论】:

    【解决方案2】:

    shell=True 仅在您执行类似操作时才需要

    subprocess.run("/path/to/sh /path/to/file1 /path/to/file2", shell=True)
    

    shell 会将单个字符串拆分为参数,这些参数将标识为程序名称及其参数。但是您已经已经确定了程序名称及其参数,所以

    subprocess.run(['/path/to/sh', '/path/to/file1', '/path/to/file2'])
    

    就是你所需要的。


    通过使用列表 shell=True,你实际上是在要求 Python 执行

    sh -c /path/to/sh /path/to/file1 /path/to/file2
    

    在要执行的命令中使用/path/to/file1设置$0的值,而不是$1

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多