【问题标题】:Call shell script from python code without any return value (0) or new lines从 python 代码调用 shell 脚本,没有任何返回值 (0) 或新行
【发布时间】:2016-01-25 01:17:54
【问题描述】:

假设我的 shell 脚本在运行时返回值“19”。我想将该值(没有任何返回值 0 或空行)存储到我的 python 代码中的一个变量中以供以后使用。

这里有很多问题与我的类似参考,但我还没有找到解决方案,其中 shell 脚本返回我 '19' 而没有额外的返回值 0 或新行。

在 python 代码中使用 subprocess.call('bash TestingCode', shell=True) 会返回我想要的结果,但是当我将此命令存储在一个变量中然后打印该变量时,它会打印一个额外的 0。

answer = subprocess.call('bash TestingCode', shell=True)
print answer

>>19
>>0

然后我尝试了这个问题的一个例子:How to return a value from a shell script in a python script

但是它会返回一个额外的空行。

answer = subprocess.check_output('bash TestingCode', shell=True)
print answer
>>19
>> 

非常感谢您的帮助!

更新:TestingCode 脚本

#!/bin/bash
num=19
echo $num

【问题讨论】:

  • 您会在屏幕上看到 19,因为 bash 脚本运行 print(19)(或类似的东西)。它不会返回 19 并且您不能将其分配给变量。如果脚本运行exit(19)(或类似的东西),那么你会在变量answer中得到这个值
  • 你能分享你的shell脚本吗
  • @AlokThakur 我的 shell 脚本只是 num=19 echo $num

标签: python bash python-2.7 shell


【解决方案1】:

只要这样称呼它:

import subprocess

answer = subprocess.check_output('bash TestingCode', shell=True)
answer = answer.rstrip()

原因是您的 shell 脚本正在打印 19 后跟一个新行。因此,subprocess.check_output() 的返回值将包括由 shell 脚本生成的新行。调用str.rstrip() 将删除任何尾随空格,在这种情况下只留下'19'

【讨论】:

  • 另外,为了澄清当你说“原因是你的 shell 脚本正在打印 19 后跟一个新行”时,我的脚本(根据我的问题更新)在运行时只打印 19它自己(在python代码之外),那么额外的行来自哪里?
  • 没有“额外”的新行,只有echo 默认输出的那一行。您可以使用 -n 选项告诉 echo 不要输出尾随的新行,即 echo -n $num,然后您不需要使用 rstrip(),即使剥离字符串通常不会有任何坏处。跨度>
  • 它就像python2.x中的打印一样,带有额外的行,允许换行。类似的行为回声演示。您可以通过 res = subprocess.Popen('script.sh', stdout=subprocess.PIPE,shell=True); 来验证这一点res.communicate()
  • 我还有一个小问题,可能有点偏离主题,所以如果可以的话,请多多包涵> 如何让 python 将变量“答案”视为整数?还是在我的情况下这是不可能的?
  • 只需致电answer = int(answer)。您甚至不需要再费心剥离字符串了。
【解决方案2】:

尝试调用subprocess.Popen,它返回时不带0。

【讨论】:

  • 这会在显示值 19 之前返回我额外的一行 <subprocess.Popen object at 0x7eff60220550>
【解决方案3】:

这对我有用。我怀疑您的 shell 脚本中存在导致输出的问题。

$ cat test.sh
#!/bin/sh
exit 19
(0) austin@Austins-Mac-8:~
$ python2.7
Python 2.7.10 (default, Aug 22 2015, 20:33:39)
[GCC 4.2.1 Compatible Apple LLVM 7.0.0 (clang-700.0.59.1)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import subprocess
>>> subprocess.call('bash test.sh', shell=True)
19
>>> 

【讨论】:

  • 是的,正如我在问题中提到的,当我直接调用subprocess.call('bash test.sh', shell=True) 时,它会返回当前值 19。只有当我将它存储在一个变量中然后打印它的变量时返回一个额外的“0”
猜你喜欢
  • 2011-04-16
  • 2016-03-14
  • 2018-01-23
  • 2011-11-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-29
  • 1970-01-01
相关资源
最近更新 更多