【问题标题】:calling wrapper script in subprocess在子进程中调用包装脚本
【发布时间】:2013-04-16 07:07:45
【问题描述】:

我有一个wrapperexec,它应该调用exec 和一些参数。

subprocess.check_call( ["wrapperexec", "exec", "arg1"], shell=True, cwd="/dirA" )

当我调用上面的脚本时,它不会向wrapperexec 传递任何参数。 但是当我改为:

subprocess.check_call( ["wrapperexec", "exec", "arg1"], shell=False, cwd="/dirA" )

它确实按预期传递参数。 有人可以向我解释一下,为什么前者不起作用?

编辑:

抱歉,我在创建此问题时完全走错了方向。现在更新到真正的问题。

【问题讨论】:

  • check_call 如果找不到脚本或脚本返回非零值,将引发异常。 “结束”输出表明您的子程序成功执行但没有输出。
  • @monk 这让我相信这是搜索路径,但实际上是命令调用

标签: python linux shell python-2.7 subprocess


【解决方案1】:

环境path是一个复杂的概念,有万物共享的“基础”path,但您也可以在特定进程中临时修改或附加path。这意味着如果您在脚本中修改path,然后调用subprocess,则subprocess 将不会具有与父脚本相同的path

除非您执行以下操作:

subprocess.check_call(["nonsystemexec"], shell=True, cwd="/dirA", env=os.environ)

在这里,您告诉subprocess 使用您当前的环境,其中将包括您当前的path


注意:如果您想让subprocess 使用修改后的环境,但不是您拥有的环境。你可以这样做:

env = os.environ.copy()
env['PATH'] += ';/dirB'
subprocess.check_call(["nonsystemexec"], shell=True, cwd="/dirA", env=env)

【讨论】:

  • 这似乎矛盾如果env不是None,那它一定是一个映射,定义了新进程的环境变量;这些用于代替继承当前进程的环境,这是默认行为。在文档中。
  • @LCIDFire 也许它可能似乎这样做,但如果你愿意尝试,它会奏效。
  • 并为每个 check_call 传递 env,没有任何区别。
  • 我注意到,您提到了/dirB,但在代码中使用了/dirA,而且您的cmdstr,而不是list
  • /dirB 是文件所在的位置,/dirAcwdcmd 实际上是 list 但不应该有任何区别,AFAIK。
猜你喜欢
  • 1970-01-01
  • 2013-12-23
  • 2012-07-31
  • 1970-01-01
  • 1970-01-01
  • 2015-07-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多