Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/351.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在bash脚本中嵌入短python脚本_Python_Bash - Fatal编程技术网

在bash脚本中嵌入短python脚本

在bash脚本中嵌入短python脚本,python,bash,Python,Bash,我想将短python脚本的文本嵌入到bash脚本中,以便在我的.bash\u概要文件中使用。做这样的事最好的方法是什么 到目前为止,我的解决方案是使用-c选项调用python解释器,并告诉解释器执行它从stdin读取的任何内容。在此基础上,我可以构建如下简单工具,允许我处理文本,以便在交互式提示中使用: function pyexec() { echo "$(/usr/bin/python -c 'import sys; exec sys.stdin.read()')" } funct

我想将短python脚本的文本嵌入到bash脚本中,以便在我的
.bash\u概要文件中使用。做这样的事最好的方法是什么

到目前为止,我的解决方案是使用
-c
选项调用python解释器,并告诉解释器执行它从
stdin
读取的任何内容。在此基础上,我可以构建如下简单工具,允许我处理文本,以便在交互式提示中使用:

function pyexec() {
    echo "$(/usr/bin/python -c 'import sys; exec sys.stdin.read()')"
}

function traildirs() {
    pyexec <<END
trail=int('${1:-3}')
import os
home = os.path.abspath(os.environ['HOME'])
cwd = os.environ['PWD']
if cwd.startswith(home):
    cwd = cwd.replace(home, '~', 1)
parts = cwd.split('/')
joined = os.path.join(*parts[-trail:])
if len(parts) <= trail and not joined.startswith('~'):
    joined = '/'+joined
print joined
END
}

export PS1="\h [\$(traildirs 2)] % "
函数pyexec(){
echo“$(/usr/bin/python-c'import sys;exec sys.stdin.read())”
}
函数traildirs(){

pyexec为什么需要使用
-c
?这对我很有用:

python << END
... code ...
END

pythonpython解释器在命令行上接受
-
作为
stdin
的同义词,因此您可以用以下内容替换对pyexec的调用:

python - <<END

python-有趣……我现在也想要一个答案;-)

他并不是问如何在bash脚本中执行python代码,而是问如何让python设置环境变量

把它放在bash脚本中,试着让它说“它成功了”

export ASDF=“它不起作用”

python如果需要在bash脚本中使用python的输出,可以执行以下操作:

#!/bin/bash

ASDF="it didn't work"

ASDF=`python <<END
ASDF = 'it worked'
print ASDF
END`

echo $ASDF
!/bin/bash
ASDF=“它不起作用”

ASDF=`python如果使用zsh,可以使用zsh和python stdin选项(
python-
)将python嵌入脚本中:

py_cmd=${(j:\n:)“${(f)$(
#你也可以添加评论,只要你平衡报价

有时使用here文档不是一个好主意。另一种选择是使用python-c:

py_script="
import xml.etree.cElementTree as ET,sys
...
"

python -c "$py_script" arg1 arg2 ...

在这里使用bash
文档
的一个问题是,脚本随后会在
stdin
上传递给Python,因此如果您想将Python脚本用作过滤器,它会变得很难处理。另一种方法是使用
bash
进程替换
,类似这样:

... | python <( echo '
code here
' ) | ...
... | python <(
cat << "END"
code here
END
 ) | ...
在脚本内部,您可以像平常一样从/到标准i/o进行读/写操作(例如,
sys.stdin.readlines
以吸收所有输入)

另外,
python-c
也可以像其他答案中提到的那样使用,但我喜欢这样做,即在遵守python的缩进规则()的同时,很好地格式化:


read-r-d''脚本准备好用输入复制粘贴示例:

input="hello"
output=`python <<END
print "$input world";
END`

echo $output
input=“你好”
output=`python尝试以下方法:

#!/bin/bash
a="test"
python -c "print  '$a this is a test'.title()"


嗯--我在python手册页上做了一个文本搜索,但是文本
stdin
不在其中。但是仔细看,“标准输入”是.Doh。同意herdeoc方法可以工作。但是,有一些事情需要小心:(1)如果herdeoc标记(
END
,在Ned的示例中)在Python脚本的第0列中发生,herdeoc将提前结束;(2)herdeoc标记的变化(带或不带前导
-
)会影响制表符和空格是否被保留;(3)当变量扩展打开时,Python和bash之间的语法重叠(herdeoc标记未被引用),例如
${1}
可以合法地出现在Python字符串格式说明符中,但如果没有引用herdoc标记,则会被替换为bash命令行参数。请注意如何命名herdoc标记。在示例中,当它没有引用时,将在herdoc字符串中进行shell扩展。例如,如果Python代码由j组成ust
print'$SHELL'
,输出将是
/bin/bash
或任何您的SHELL。如果您将第一行更改为
python,一个完整的示例会很好。Ricardo Cárdenes下面的回答有一个更完整的示例,仅供参考:您能更清楚地说明您实际上在尝试做什么吗?据我所见,python是不太需要。你可以用shell做大多数事情。@ghostdog74:没有什么比我说的更深刻的了;我只是一个比bash程序员好得多的python程序员,而IMO python通常比bash更强大。在python中实现bash脚本中使用的功能可能很方便,有时也不依赖外部files。我终于从tcsh切换到bash(15年后),并且我正试图按照我的意愿/偏好来调整shell。-1:为什么不简单地创建一个.py模块文件呢?为什么在更好的解决方案(通常)是要完全停止使用shell?@S.Lott:在我的例子中,我正在以Alfred命令的形式运行bash脚本,但需要Python的拆分功能。创建一个.py文件会增加不必要的开销。这并不是我真正想要的,而且我很确定您不能(直接)从子进程获取环境变量或者(直接)更改父级的环境变量。但是,您可以
eval
在bash脚本中计算python脚本的输出,从而执行任意语句、设置环境变量或执行任何您可能喜欢的操作。@Eric:如果您确实想要答案,请发布您自己的问题。Matt,对不起……我简要地查看了您的python脚本,看到您正在使用os.envir进行操作我的错误。你可以通过组合一个bash变量和python输出来管理它。请参见下面我的回答。要将输出收集到一个变量中,我做了
ABC=$(python如果我们想向python传递来自bash脚本的字符串参数,该怎么办?然后您需要
-
,如Ned的回答中所示。参数将在破折号后面。请注意如何命名heredoc标记。当它如示例中所示不带引号时,shell扩展将发生在heredoc字符串中。例如,如果您的python代码仅由
打印“$SHELL”
组成,输出将是
/bin/bash
或任何您的SHELL。如果您将第一行更改为
python-@user3342981,如果您将所有内容都放在一行中,就像它看起来的那样,这将不起作用:be
read -r -d '' script <<-"EOF"
    code goes here prefixed by hard tab
EOF
python -c "$script"
function somefunc() {
    read -r -d '' script <<-"----EOF"
        code goes here prefixed by hard tab
----EOF
    python -c "$script"
}
input="hello"
output=`python <<END
print "$input world";
END`

echo $output
#!/bin/bash
a="test"
python -c "print  '$a this is a test'.title()"