【问题标题】:Return string from Python to Shell script从 Python 返回字符串到 Shell 脚本
【发布时间】:2017-08-06 03:31:33
【问题描述】:

我有类似的 Python 代码:

x = sys.argv[1]
y = sys.argv[2]
i = sofe_def(x,y)

if i == 0:
    print "ERROR"
elif i == 1:
    return str(some_var1)
else:
    print "OOOps"
    num = input("Chose beetwen {0} and {1}".format(some_var2, some_var3))
    return str(num)

之后我必须在 shell 脚本中执行这个脚本并在 shell 变量中返回字符串,比如:

VAR1="foo"
VAR2="bar"
RES=$(python test.py $VAR1 $VAR2)

不幸的是,它不起作用。由于代码中有大量 print 和 input(),stderr、stdout 和 stdin 的方式也不起作用。那么我该如何解决我的问题呢?谢谢你的回答

【问题讨论】:

  • 您是否尝试仅从您的 python 命令打印并将其设置为变量而不执行任何系统退出?例如local_dir=$(python execute_tensorboard.py $1)?

标签: python bash python-2.7 shell


【解决方案1】:

那甚至不是有效的 Python 代码;您在函数之外使用return。你不想在这里return,只是一个print 声明。

x, y = sys.argv[1:3]
i = sofe_def(x,y)

if i == 0:
    print >>sys.stderr, "ERROR"
elif i == 1:
    print str(some_var1)
else:
    print >>sys.stderr, "OOOps"
    print >>sys.stderr, "Choose between {0} and {1}".format(some_var2, some_var3)
    num = raw_input()
    print num

(注意其他一些变化:

  1. 将您的错误消息写入标准错误,以避免它们也被捕获。
  2. 在 Python 2 中使用 raw_input,而不是 input

)

然后是你的外壳

VAR1="foo"
VAR2="bar"

RES=$(python test.py "$VAR1" "$VAR2")

应该可以。除非您有充分的理由,否则请始终引用参数扩展。

【讨论】:

  • 哦,首先我忘记了我的 Python 脚本是从 def 中提取的))谢谢 - 一切正常!但是你错过了print >>sys.stderr "ERROR"中的,print >>sys.stderr, "ERROR"和`num =raw_input("Choose between {0} and {1}".format(some_var2, some_var3))也在结果中输出文本,我把它修好了:print >>sys.stderr "Choose between {0} and {1}".format(some_var2, some_var3)
  • 出于某种原因,我记得raw_input 将其提示打印为标准错误;我可能将它与 shell read 混淆了。我肯定print 语句与Perl 的printf STDERR "Ooops\n" 混淆了(其中不允许使用逗号,因为Perl 有噩梦般的语法)。
  • 这似乎不起作用,它正在保存我要执行的命令而不是它的返回值外观:(metalearning) brando~ ❯ VAR=%(python /Users/brando/ultimate-utils/ultimate-utils-project/execute_tensorboard.py /home/miranda9/data/logs/logs_Mar06_11-15-02_jobid_0_pid_3657/tb) (metalearning) brando~ ❯ echo $VAR %(python /Users/brando/ultimate-utils/ultimate-utils-project/execute_tensorboard.py /home/miranda9/data/logs/logs_Mar06_11-15-02_jobid_0_pid_3657/tb)
  • @CharlieParker 你用的是什么外壳?命令替换是$(...) 中的bash,而不是%(...),但在这种情况下,我预计会出现其他错误,而不是对VAR 的完整分配。
  • 我们可以使用多个打印传递多个字符串吗?如果是,我们应该如何在 bash 文件中获取它们?
【解决方案2】:

只需使用 print 而不是 return - 你 bash sn-p 期望 STDOUT 上的结果。

【讨论】:

  • 您能更准确地了解变量设置的工作原理吗?我试过了:(metalearning) brando~ ❯ VAR=python /Users/brando/ultimate-utils/ultimate-utils-project/execute_tensorboard.py /home/miranda9/data/logs/logs_Mar06_11-15-02_jobid_0_pid_3657/tb zsh: permission denied: /Users/brando/ultimate-utils/ultimate-utils-project/execute_tensorboard.py 但它不起作用。
猜你喜欢
  • 2016-03-14
  • 1970-01-01
  • 2013-07-16
  • 1970-01-01
  • 2020-12-12
  • 1970-01-01
  • 1970-01-01
  • 2022-01-12
  • 1970-01-01
相关资源
最近更新 更多