对于一个以python -c
为导向的解决方案,并且您使用Bash shell,您可以像这个示例一样拥有一个简单的单行语法:
假设您想要执行类似以下内容的操作(与您的示例非常相似,包括except: pass
指令):
python -c "from __future__ import print_function\ntry: import numpy; print( numpy.get_include(), end='\n' )\nexcept:pass\n" OUTPUT_VARIABLE __numpy_path
这样做将
无法成功并产生以下
错误:
File "<string>", line 1
from __future__ import print_function\ntry: import numpy; print( numpy.get_include(), end='\n' )\nexcept:pass\n
^
SyntaxError: unexpected character after line continuation character `
这是因为Bash和Python之间存在竞争,解释转义字符
\n
。为了解决这个问题,可以使用
$'string'
Bash语法,在Python解释之前强制执行Bash解释
\n
。
为了让示例更具挑战性,我在Python打印调用中添加了一个典型的
end=..\n..
规范:最终您将能够同时使用Bash和Python的
\n
解释,每个都在其关注的文本片段上运行。所以最后的正确解决方案是这样的:
python -c $'from __future__ import print_function\ntry:\n import numpy;\n print( numpy.get_include(), end="\\n" )\n print( "Hello" )\nexcept:pass\n' OUTPUT_VARIABLE __numpy_path
这将产生正确的干净输出,没有错误:
/Softs/anaconda/lib/python3.7/site-packages/numpy/core/include
Hello
注意:这也适用于基于exec
的解决方案,因为问题仍然是相同的(Bash和Python解释器的竞争)。
注意2:可以通过将一些\n
替换为一些;
来解决问题,但它不会始终有效(取决于Python结构),而我的解决方案允许始终将任何经典多行Python程序“单行化”。
注意3:当进行单行处理时,我们始终要注意Python空格和缩进,因为实际上我们在这里并不严格地“单行化”,而是在Bash和Python之间进行适当的混合管理\n
转义序列。这就是我们如何处理任何经典多行Python程序的方法。解决方案示例也说明了这一点。
\n
换行符,并使用空格进行缩进。 - user3210045