【问题标题】:Send parameters and run bash from python发送参数并从 python 运行 bash
【发布时间】:2013-10-27 04:04:16
【问题描述】:

我需要一些帮助来从 python 中运行 bash 脚本。我有一个程序将参数发送到 python 脚本(例如,“$1”)。我想从 python 脚本中运行一个 bash 脚本,向它发送参数,然后在 python 脚本中接收并打印 bash 的结果(回声)。这就是我所拥有的:

#!/usr/bin/env python

import subprocess
process = subprocess.Popen('sorter.sh', stdout=subprocess.PIPE, shell=True) 
out, err = process.communicate()
print(out)

但是,当我尝试运行它时,出现以下错误:/bin/sh: sorter.sh: not found

当我将 arg 更改为 'sh sorter.sh' 我得到 sh: can't open 'sorter.sh'

我确信 bash 脚本可以工作...当我从 shell 运行它并为其提供一个文件 (sh sorter.sh /file/filed/files.jpg) 时,一切都很顺利。谁能告诉我我做错了什么?谢谢!

【问题讨论】:

  • 尝试使用完整路径或./sorter.sh

标签: python bash shell parameters subprocess


【解决方案1】:

根据错误消息,当前工作目录中似乎没有sorter.sh。指定脚本的绝对路径。

替换以下内容:

process = subprocess.Popen('sorter.sh', stdout=subprocess.PIPE, shell=True) 

与:

process = subprocess.Popen('sh /path/to/sorter.sh', stdout=subprocess.PIPE, shell=True)

或:

process = subprocess.Popen(['sh', '/path/to/sorter.sh'], stdout=subprocess.PIPE)

【讨论】:

  • 或者将相关目录添加到PATH环境变量中。
  • 谢谢,第一个做到了,呵呵。我曾认为 bash 脚本与 python 位于同一目录中就足够了。显然不是!
【解决方案2】:

要将您的 Python 脚本收到的参数发送到 bash 脚本,您可以使用sys.argv

#!/usr/bin/env python
import sys
from subprocess import check_output as qx

output = qx(["/path/to/sorter.sh"] + sys.argv[1:])
print output,

如果您将 python 脚本称为python-script a b c,那么它会使用abc 参数调用sorter.sh

注意:代码要求sorter.sh 具有适当的shebang执行 权限(chmod +x /path/to/sorter.sh)。

【讨论】:

  • 我尝试运行您的脚本并得到 OSError: no such file or directory(即使使用更正后的 sorter.sh 完整路径)。然后我尝试将它与我最初的尝试结合起来,如下所示:import sys import subprocess print 'Argument List:', str(sys.argv) process = subprocess.Popen(["sh /usr/local/sabnzbd/var/scripts/sorter.sh"] + sys.argv[1:], stdout=subprocess.PIPE, shell=True) out, err = process.communicate() print(out) 现在全部运行,但参数仍未发送。还有什么想法吗?如果我尝试只向 bash 发送一个参数会更容易吗?
  • @Artfail:您应该照原样复制代码(sorter.sh 的路径除外)。什么是 shebang (head -1 sorter.sh)? sorter.sh (ls -l sorter.sh) 的文件权限是什么?
  • 代码被直接复制(并且路径固定)。文件权限为 755 (-rwxr-xr-x 1 root root),我尝试将 shebang 设置为 #!/bin/bash#!/bin/env bash;无论哪种方式,我都会得到以下信息:
  • Traceback (most recent call last): File "/usr/local/sabnzbd/var/scripts/worksmac.py", line 5, in <module> output = qx(["/usr/local/sabnzbd/var/scripts/hasworked.sh"] + sys.argv[1:]) File "/usr/local/python/lib/python2.7/subprocess.py", line 568, in check_output process = Popen(stdout=PIPE, *popenargs, **kwargs) File "/usr/local/python/lib/python2.7/subprocess.py", line 711, in __init__ errread, errwrite) File "/usr/local/python/lib/python2.7/subprocess.py", line 1308, in _execute_child raise child_exception OSError: [Errno 2] No such file or directory
  • 当我作为#!/usr/bin/env bash 时,它返回env: bash: No such file or directory Traceback (most recent call last): File "/usr/local/sabnzbd/var/scripts/worksmac.py", line 5, in <module> output = qx(["/usr/local/sabnzbd/var/scripts/hasworked.sh"] + sys.argv[1:]) File "/usr/local/python/lib/python2.7/subprocess.py", line 575, in check_output raise CalledProcessError(retcode, cmd, output=output) subprocess.CalledProcessError: Command '['/usr/local/sabnzbd/var/scripts/hasworked.sh', '/volume1/Storage Unit/^Complete']' returned non-zero exit status 127
猜你喜欢
  • 1970-01-01
  • 2021-04-18
  • 1970-01-01
  • 1970-01-01
  • 2023-04-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多