You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Bash管道调用Python出现行续接符语法错误排查

解决Python Shell通过Bash管道传入代码时的语法错误

这个问题的根源在于POSIX标准的sh(比如Ubuntu上的dash)中,echo命令默认不会解析转义序列(比如\n,导致你传入Python的不是多行代码,而是带有字面量\n字符的单行代码。Python解析时会把\当成行续符,后面跟着的n就成了非法字符,从而触发SyntaxError: unexpected character after line continuation character

为什么第二个脚本能运行?

大概率是你运行第二个脚本时的环境中/bin/sh指向的是bash(而非dash),而bash的内置echo在默认情况下会解析转义序列,把\n转换成实际的换行符,所以Python收到的是合法的多行代码。但当你运行第一个脚本时,环境切换到了POSIX兼容的shecho不处理转义,就触发了错误。

解决方案

推荐两种可靠的方法,彻底避免依赖echo的行为差异:

方法1:使用printf(POSIX标准兼容)

printf在所有POSIX shell中都支持转义序列,替换echo即可:

#!/bin/sh
printf "from rest_framework_api_key.models import APIKey\n_, key = APIKey.objects.create_key(name='test_key')\nprint(key)\n" | python manage.py shell

方法2:使用Heredoc(更易读,推荐)

Heredoc可以直接传递多行文本,不需要转义换行符,代码可读性更高,也更不容易出错:

#!/bin/sh
python manage.py shell << EOF
from rest_framework_api_key.models import APIKey
_, key = APIKey.objects.create_key(name='test_key')
print(key)
EOF

这种方式会把EOF之间的内容原样传递给Python shell,完全避免转义问题,后续修改代码也更方便。

快速验证问题

你可以先单独执行echo命令看输出:

echo "from rest_framework_api_key.models import APIKey\n_, key = APIKey.objects.create_key(name='test_key')\nprint(key)"

如果输出里包含\n字符而不是实际换行,就说明你的sh不解析转义序列,这就是问题的核心。

内容的提问来源于stack exchange,提问作者alex_halford

火山引擎 最新活动