【问题标题】:Executing a shell script with parameters through python always takes the default values when executing the shell script通过python执行带参数的shell脚本在执行shell脚本时总是采用默认值
【发布时间】:2014-01-25 21:00:24
【问题描述】:

我的 python 应该使用五个参数执行 /home/file.sh,如下所示。但是,每次我执行我的 python 脚本时,它都会忽略参数,并且 shell 脚本使用默认值执行。我也尝试过将 shell 设置为 False,但没有成功。有任何想法吗 ?提前谢谢!

var1='-t'
var2='m'
var3='20130105'
var4='-f'
var5='test.txt'

process=subprocess.Popen(['/home/file.sh', str(var1), str(var2), str(var3), str(var4), str(var5)],shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
process.wait()
lists=process.communicate()[0]

我尝试了以下方法,但它再次使用默认参数

process=subprocess.Popen(['/home/file.sh  -t m 20140105 -f test.txt')],shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)

【问题讨论】:

  • 另外,请注意您不必明确地wait,因为communicate 意味着等待进程退出。

标签: python shell subprocess sh


【解决方案1】:

这样试试:

process=subprocess.Popen('/home/file.sh -t m 20140105 -f test.txt', shell=True, ...)

无需担心为您的命令传递列表。

【讨论】:

  • 你怎么知道file.sh做错了? file.sh 的输出与预期的输出是什么?
【解决方案2】:

要么使用参数列表并设置shell=False,例如

process=subprocess.Popen(["./test.sh","a","b","c"], shell=False, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
print process.communicate()[0] 

或者你可以使用一个字符串参数并通过设置shell=True让shell解析它,例如

process=subprocess.Popen("./test.sh a b c", shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
print process.communicate()[0]

但使用shell=True时不能发送列表。

两者都会输出

0: ./test.sh
1: a
2: b
3: c

如果 test.sh 是一个可执行文件,内容如下:

#!/bin/sh

echo 0: $0
echo 1: $1
echo 2: $2
echo 3: $3

通常,我更喜欢使用shell=False 来避免转义参数字符串(这比正确处理要复杂得多)。但是使用 shell 有一些优势,例如路径的扩展、能够使用 shell 内部等等。

【讨论】:

  • 您确定您的脚本工作正常吗?您可以从常规 shell 运行此命令行吗?
  • 嗨,是的,它可以通过命令运行。如果有办法修改脚本以直接使用 $1、$2、...,我会仔细检查脚本。我会及时通知你谢谢!
猜你喜欢
  • 2018-02-19
  • 2013-04-17
  • 2014-10-06
  • 2020-05-31
  • 1970-01-01
  • 2011-10-09
  • 1970-01-01
  • 2013-10-21
  • 1970-01-01
相关资源
最近更新 更多