【问题标题】:Launching a very complex command in a Python program在 Python 程序中启动一个非常复杂的命令
【发布时间】:2019-01-26 15:18:14
【问题描述】:

在 Python 程序中,我需要启动一个复杂的命令,实际上是一个需要大量参数的 Python 程序。我需要启动的是这样的:

./calculations.py -id -k "{'names':['r','pst'],'index_IN':['at','gl'],'index_OUT':[1,1]}"

                      -r "[False,False]" -N "[False,False]" -c "['values1**2','np.exp(values2)']"

                       $SCRATCH/my_dir/*

(确实更复杂,但主要思想都在这个例子中)。

因此,关键点是示例中"' 的存在,以及计算的使用(平方数和numpy 的幂运算)。我已经尝试过subprocess.Popen,但不知何故我无法让它工作。我的尝试:

proc = subprocess.Popen(["./calculations.py -id", "-k", 

       "{'names':['r','pst'],'index_IN':['at','gl'],'index_OUT':[1,1]}"], ........])

谢谢。

【问题讨论】:

  • 调用另一个 Python 程序作为子进程通常是错误的。不能import calculations直接调用它的main函数作为原生Python函数调用吗?
  • 您需要在后台运行该进程还是只运行它?您需要查看其输出或退出状态吗?
  • 是否需要完全按照所示传递计算,即文字字符串'values1**2''np.exp(values2)',还是应该用首先评估这些 Python 表达式的结果替换它们?我怀疑是前者(字符串),因为values1values2 是未定义的变量。
  • 将看起来像 Python 可执行表达式的东西作​​为命令行参数传递也看起来真正的问题是 calculations.py 是邪恶的。就像,邪神邪神。
  • @tripleee:我怀疑你的评论对许多听到它的人来说是否有意义,尤其是“Cthulhu”参考。

标签: python shell command-line subprocess popen


【解决方案1】:

如果您同时需要 ' 和 ",您可以在 python 中将字符串保存为带有 r 前缀的原始字符串,而不是考虑使用原始长 python 字符串:

cmdAttributes = r"""{'names':['r','pst'],'index_IN':['at','gl'],'index_OUT':[1,1]}"""

灵活的条目也是如此:

pnames = r"['r','pst']"
pindex_IN = r"['at','gl']"
pindex_OUT = r"[1,1]"

cmdAttributes = r"""{{'names':{Names},'index_IN':{Index_IN},'index_OUT':{Index_OUT} }}""".format(
        Names = pnames,
        Index_IN = pindex_IN,
        Index_OUT = pindex_OUT)

两个代码的 cmdAttributes 将相同。

【讨论】:

  • 这似乎是个好主意,但为什么 3 " 而不是 2(命令需要一个,字符串需要一个)?
  • 啊,不,这是一个名为 long string 的实习生 python 类型,它以 3 "开头和结尾" 它也用于评论函数和类。但由于它不使用 " 和 ' 来表示我一直使用的任何东西这个数据类型来保存命令行参数。
  • 另外,想象一下我不仅需要添加常量,还需要添加一个变量(因为我必须在循环中多次启动此命令),所以'index_OUT' 需要是一个向量,并不总是 [ 1, 1],但通常是 [my_num, my_num]。因为format{} {} 似乎不起作用。谢谢。
  • 对于 { 使用格式只需将“真实”的格式加倍,就像我在示例中所做的那样。我测试了代码,停止告诉我它不起作用 xD @martineau 是对的,最好将它作为字符串列表而不是一个长字符串传递
  • 好的,现在可以使用了(我删除了之前没有用的评论)。非常感谢!
猜你喜欢
  • 1970-01-01
  • 2014-01-22
  • 2016-04-26
  • 2018-10-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-04
  • 2010-12-17
相关资源
最近更新 更多