2

今天我写了一个 Python 脚本来处理数据并以自定义格式打印它们。它在交互式 Python 下按预期工作。然后我继续尝试在终端中将输出重定向到文本文件,并遇到了一些意想不到的事情。

我尝试的特定示例是按列排列数据列表,并以 LaTeX 表格格式打印它们。它或多或少像:

foo(mylist, sep_col='\t', sep_row=r'\\ \hline')

当我尝试在终端中运行脚本时,我这样做了:

$ python -c "from foo import foo; foo(mylist, col_sep=' & ', row_sep=r' \\ \hline')" > results.txt

但结果\\ \hline显示部分显示为\ \hline,与交互式 Python 下不一样。

当我更多地研究问题(或者可能是背后的原理)时,我发现 Python 脚本的行为由$ python -c在交互式 Python 下处理的 Python 脚本的行为是不一样的。

在交互式 Python 下:>>> print r'\\'给出\\

但是,在终端中,$ python -c "print r'\\'"引发了SyntaxError

  File "<string>", line 1
    print r'\'
             ^
SyntaxError: EOL while scanning string literal

当反斜杠的数量为 3 或 4 时,终端似乎给出\\。数字 5 或 6 会引发错误。7个反斜杠 give ,表示在这种环境下\\\\没有办法给。\\\

这个问题我找了好久,好像很少有人讨论$ python -c。如果我复制了,请提前道歉。

4

3 回答 3

2

在终端中,说:

$ python -c "print r'\\'"
  File "<string>", line 1
    print r'\'
             ^
SyntaxError: EOL while scanning string literal

导致错误,因为 shell 开始发挥作用。它转换 \\\(仔细查看错误消息)。

相反,说

$ python -c 'print r"\\"'
\\

从 shell 运行时,即在单引号中提供命令,print在双引号中提供参数。

您在交互模式下执行的命令相当于:

$ python -c "print r'\\\\'"
\\

编辑:这个答案解释了为什么原始字符串不能有奇数个反斜杠。

此外,官方FAQ中也对此进行了说明。

于 2013-08-23T12:25:20.313 回答
0

您的终端无法识别原始字符串或正则表达式字符串,即r'something'任何特殊的字符串,并且所有反斜杠都需要在终端中通过反斜杠进行转义,因此:

python -c "from foo import foo; foo(mylist, col_sep=' & ', row_sep=r' \\ \hline')" > results.tx

需要是:

python -c "from foo import foo; foo(mylist, col_sep=' & ', row_sep=r' \\\\ \\hline');" > results.tx

foo(mylist, sep_col='\t', sep_row=r'\\ \hline')

将映射到:

python -c "from foo import foo; foo(mylist, sep_col='\\t', sep_row=r'\\\\ \\hline');"
于 2013-08-23T12:27:19.177 回答
0

您的 shell 也会解释双引号内的反斜杠。您可以使用单引号来避免这种情况;那么您将不得不将python脚本中的单引号更改为双引号:

python -c 'from foo import foo; foo(mylist, col_sep=" & ", row_sep=r" \\ \hline")'

在这种情况下,您可以使用echo调试:只需echo在您的 shell 命令之前编写以查看将要执行的内容:

echo python -c "print r'\\'"

显示:

python -c print r'\'
于 2013-08-23T12:24:24.937 回答