python3偶尔会在换行时拆分argv

2024-10-02 16:33:29 发布

您现在位置:Python中文网/ 问答频道 /正文

太长了,读不下去了,Python 3在奇怪的地方偶尔会分裂{{CD1}},不像Python 2。你知道吗

讨论最初是在on the Git mailing list开始的。在短暂的谷歌搜索之后,我找不到任何关于这个主题的文档。你知道吗

print_argv.py

import sys
from pprint import pprint

pprint(sys.argv)

test.py

import sys
import subprocess

subprocess.check_call([
    'python%s' % sys.argv[1],
    './print_argv.py',
    'similarity index 90%\nrename from file1.txt\nrename to file1-mv.txt\nindex 2bef330..f8fd673 100644\n',
])

Python 2,预期行为:

$ python3 test.py 2
['./print_argv.py',
 'similarity index 90%\nrename from file1.txt\nrename to file1-mv.txt\nindex 2bef330..f8fd673 100644\n']

Python 3,破坏行为:

$ python3 test.py 3
['./print_argv.py',
 'similarity index 90%\n'
 'rename from file1.txt\n'
 'rename to file1-mv.txt\n'
 'index 2bef330..f8fd673 100644\n']

直接通过shell实现。Python 2,预期行为:

$ python2 print_argv.py 'similarity index 90%\nrename from file1.txt\nrename to file1-mv.txt\nindex 2bef330..f8fd673 100644\n'
['print_argv.py',
 'similarity index 90%\\nrename from file1.txt\\nrename to file1-mv.txt\\nindex 2bef330..f8fd673 100644\\n']

Python3,非常坏的行为:

$ python3 print_argv.py 'similarity index 90%\nrename from file1.txt\nrename to file1-mv.txt\nindex 2bef330..f8fd673 100644\n'
['print_argv.py',
 'similarity index 90%\\nrename from file1.txt\\nrename to '
 'file1-mv.txt\\nindex 2bef330..f8fd673 100644\\n']

这种分裂行为是错误吗?你知道吗


Tags: tofrompyimporttxtindexsysfile1
1条回答
网友
1楼 · 发布于 2024-10-02 16:33:29

我已经弄明白了。这不是bug,而是pprint()的特性。它分割字符串以避免长行,并且滥用了在Python中用空格分割的字符串由解析器连接的事实。你知道吗

另外,在我的示例中,换行符在shell中没有正确解析。逃离它们,我得到与subprocess.check_call()中完全相同的行为:

$ python2 print_argv.py $'similarity index 90%\nrename from file1.txt\nrename to file1-mv.txt\nindex 2bef330..f8fd673 100644\n'
['print_argv.py',
 'similarity index 90%\nrename from file1.txt\nrename to file1-mv.txt\nindex 2bef330..f8fd673 100644\n']
$ python3 print_argv.py $'similarity index 90%\nrename from file1.txt\nrename to file1-mv.txt\nindex 2bef330..f8fd673 100644\n'
['print_argv.py',
 'similarity index 90%\n'
 'rename from file1.txt\n'
 'rename to file1-mv.txt\n'
 'index 2bef330..f8fd673 100644\n']

一个关于同一主题的问题:Can I make pprint in python3 not split strings, like in python2?

相关问题 更多 >