Je voulais écrire une petite fonction bash pour que je puisse dire bash, import osou from sys import stdoutelle engendrera un nouvel interpréteur Python avec le module importé.
La dernière fromfonction ressemble à ceci:
from () {
echo "from $@" | xxd
python3 -i -c "from $@"
}
Si j'appelle cela:
$ 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
>>>
Les octets en from syssont
66 72 6f 6d 20 73 79 73 20
f r o m s y s
Il n'y a pas d'EOF là-dedans, mais l'interpréteur Python se comporte comme s'il lisait EOF. Il y a une nouvelle ligne à la fin du flux, ce qui est à prévoir.
fromLa sœur de, qui importe un module Python entier, ressemble à ceci, et qui résout le problème en nettoyant et en traitant la chaîne, et en échouant sur des modules inexistants.
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
}
Cela résout le problème d'un EOF inexpliqué dans le flux, mais j'aimerais comprendre pourquoi Python pense qu'il y a un EOF.
