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兼容的sh,echo不处理转义,就触发了错误。
解决方案
推荐两种可靠的方法,彻底避免依赖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




