【问题标题】:Python calling shell script - no directory?Python调用shell脚本 - 没有目录?
【发布时间】:2011-05-15 19:26:01
【问题描述】:

在 python 脚本中,我如下调用 bash 脚本:

subprocess.Popen(["./scan.sh", dir])

在那个脚本里面,有,

find $1 -name "*013*.txt" > found_files.txt

出于某种原因,来自 python 的 dir 参数被翻译成在 bash 脚本中带有引号的版本。在 python 中打印 'dir' 会产生用户输入的确切路径:

~/Desktop/Files

但是,查找失败

find: '~/Desktop/Files' no such directory

使用 ~/Desktop/Files 作为参数手动运行 scan.sh 可以正常工作。怎么会有引号...?

【问题讨论】:

  • “使用 ~/Desktop/Files 手动运行 scan.sh” 在文件之后,按 Tab(一次或两次)。 shell 会为你扩展 '~',就像它在调用 scan.sh 之前扩展它(不显示它)一样。

标签: python bash find subprocess


【解决方案1】:

没有。发生的事情是 ~ 没有被解释,因为这是 shell 的工作。使用os.path.expanduser() 扩展路径,然后将其传递给subprocess。

【讨论】:

    【解决方案2】:

    使用 $HOME。 '~' 不是在引号中也不是在双引号中扩展。

    python -c "import subprocess;subprocess.Popen(['./scan.sh', '~'])"
    python -c "import subprocess;subprocess.Popen(['./scan.sh', '$HOME'])"
    

    我的 scan.sh 包含:

    #!/bin/sh
    echo =$1=
    

    第一个打印=~=,第二个打印=/Users/jomo=。

    【讨论】:

    • 使用$HOME 无济于事,因为扩展环境变量也是 shell 的工作。
    • 但是 $HOME 用双引号展开。 (不是单曲)
    • 将通过subprocess 传递给命令的所有内容都用单引号括起来。
    • 等等,你是说子进程中传递的每个参数都会被解释为你用单引号直接键入它?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-02-12
    • 2020-11-18
    • 2018-08-24
    • 2018-03-25
    • 1970-01-01
    • 2016-10-26
    • 1970-01-01
    相关资源
    最近更新 更多