我想编写一个小bash函数,这样我就可以告诉bash,import os或sys import stdout,它会在导入模块时生成一个新的Python解释器.
后者从函数看起来像这样:
from () {
echo "from $@" | xxd
python3 -i -c "from $@"
}
如果我这样称呼:
$from sys import stdout
00000000: 6672 6f6d 2073 7973 2069 6d70 6f72 7420 from sys import
00000010: 7374 646f 7574 0a stdout.
File "<string>", line 1
from sys
^
SyntaxError: invalid Syntax
>>>
来自sys的字节是
66 72 6f 6d 20 73 79 73 20
f r o m s y s
那里没有EOF,但Python解释器的行为就像它读取EOF一样.流的末尾有一个换行符,这是预期的.
从姐姐那里导入一个完整的python模块,就像这样,通过清理和处理字符串,以及通过在不存在的模块上失败来解决问题.
import () {
ARGS=$@
ARGS=$(python3 -c "import re;print(', '.join(re.findall(r'([\w]+)[\s|,]*', '$ARGS')))")
echo -ne '\0x04' | python3 -i
python3 -c "import $ARGS" &> /dev/null
if [ $? != 0 ]; then
echo "sorry, junk module in list"
else
echo "imported $ARGS"
python3 -i -c "import $ARGS"
fi
}
这解决了流中无法解释的EOF问题,但我想理解为什么Python认为有EOF.
解决方法:
this Stack Overflow answer中的表(从Bash Hackers Wiki获得)解释了如何扩展不同的Bash变量:
你正在使用python -i -c“来自$@”,它变成python -i -c“来自sys”“import”“stdout”,-c只接受一个参数,所以它从sys运行命令.你想使用$*,它将从sys import stdout扩展为python -i -c“(假设$IFS未设置或以空格开头).
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。