Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.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
通过a";“shell脚本”;作为Python subprocess.Popen的字符串_Python_Bash_Shell_Subprocess_Mininet - Fatal编程技术网

通过a";“shell脚本”;作为Python subprocess.Popen的字符串

通过a";“shell脚本”;作为Python subprocess.Popen的字符串,python,bash,shell,subprocess,mininet,Python,Bash,Shell,Subprocess,Mininet,我想执行一个字符串,就像它是Mininet的host.popen()模块中的shell脚本一样,它本质上是Python的subprocess.popen()的包装器。脚本如下: #!/bin/bash T="$(date +%s%N)" nc 10.0.0.7 1234 < somefile.txt T="$(($(date +%s%N)-T))" echo $T 问题是每次我运行这个脚本时,发送的文件,somefile.txt,都是不同的,它每秒运行几次,持续几分钟。我不希望为每

我想执行一个字符串,就像它是Mininet的
host.popen()
模块中的shell脚本一样,它本质上是Python的
subprocess.popen()的包装器。脚本如下:

#!/bin/bash

T="$(date +%s%N)" 
nc 10.0.0.7 1234 < somefile.txt
T="$(($(date +%s%N)-T))" 
echo $T
问题是每次我运行这个脚本时,发送的文件,
somefile.txt
,都是不同的,它每秒运行几次,持续几分钟。我不希望为每个文件都编写一个新的.sh脚本。当我试图将脚本作为字符串传递到
popen()

dst_cmd = 'nc -l 1234 > /dev/null'
dst.popen( dst_cmd, shell=True )

src_cmd = '''\
    #!/bin/bash

    T=\"$(date +%s%N)\" 
    nc 10.0.0.7 1234 < somefile.txt
    T=\"$(($(date +%s%N)-T))\" 
    echo $T'''

p = src.popen( dedent(src_cmd), shell=True, 
                stdout=subprocess.PIPE )    

为什么呢?我是否遗漏了导致不同(意外)输出的格式化内容?

假设mininet popen接口与Subprocess.popen相同,那么您编写的内容是错误的。您必须传递一个命令,该命令可以是:

  • 可执行文件及其参数
  • 或者一个shell命令,只要您使用
    shell=True
    ——您可以在shell提示符下键入该命令
但它不能是shell脚本的内容

当然,如果脚本可以看作是一个多行命令,并且shell支持多行命令,那么将执行单个命令。因此,如果您的默认shell已经是bash,那么它可以工作,但是如果默认shell是
/bin/ash
,那么所有命令都将由该默认shell执行,因为行
#/bin/sh
将被视为一个简单的注释,并被忽略

例如:

foo.py:

#! /usr/local/bin/python

a = 5
for i in range(10): print i
文件的执行是正确的

$ sh -c ./foo.py
0
1
2
3
4
但是文件内容的执行会导致错误,因为shebang(
#!
)被视为一个mete注释:

$ sh -c '#! /usr/local/bin/python

a = 10
for i in range(10): print i
'
a: not found
Syntax error: "(" unexpected

假设mininet popen接口与Subprocess.popen相同,那么您编写的是错误的。您必须传递一个命令,该命令可以是:

  • 可执行文件及其参数
  • 或者一个shell命令,只要您使用
    shell=True
    ——您可以在shell提示符下键入该命令
但它不能是shell脚本的内容

当然,如果脚本可以看作是一个多行命令,并且shell支持多行命令,那么将执行单个命令。因此,如果您的默认shell已经是bash,那么它可以工作,但是如果默认shell是
/bin/ash
,那么所有命令都将由该默认shell执行,因为行
#/bin/sh
将被视为一个简单的注释,并被忽略

例如:

foo.py:

#! /usr/local/bin/python

a = 5
for i in range(10): print i
文件的执行是正确的

$ sh -c ./foo.py
0
1
2
3
4
但是文件内容的执行会导致错误,因为shebang(
#!
)被视为一个mete注释:

$ sh -c '#! /usr/local/bin/python

a = 10
for i in range(10): print i
'
a: not found
Syntax error: "(" unexpected

假设mininet popen接口与Subprocess.popen相同,那么您编写的是错误的。您必须传递一个命令,该命令可以是:

  • 可执行文件及其参数
  • 或者一个shell命令,只要您使用
    shell=True
    ——您可以在shell提示符下键入该命令
但它不能是shell脚本的内容

当然,如果脚本可以看作是一个多行命令,并且shell支持多行命令,那么将执行单个命令。因此,如果您的默认shell已经是bash,那么它可以工作,但是如果默认shell是
/bin/ash
,那么所有命令都将由该默认shell执行,因为行
#/bin/sh
将被视为一个简单的注释,并被忽略

例如:

foo.py:

#! /usr/local/bin/python

a = 5
for i in range(10): print i
文件的执行是正确的

$ sh -c ./foo.py
0
1
2
3
4
但是文件内容的执行会导致错误,因为shebang(
#!
)被视为一个mete注释:

$ sh -c '#! /usr/local/bin/python

a = 10
for i in range(10): print i
'
a: not found
Syntax error: "(" unexpected

假设mininet popen接口与Subprocess.popen相同,那么您编写的是错误的。您必须传递一个命令,该命令可以是:

  • 可执行文件及其参数
  • 或者一个shell命令,只要您使用
    shell=True
    ——您可以在shell提示符下键入该命令
但它不能是shell脚本的内容

当然,如果脚本可以看作是一个多行命令,并且shell支持多行命令,那么将执行单个命令。因此,如果您的默认shell已经是bash,那么它可以工作,但是如果默认shell是
/bin/ash
,那么所有命令都将由该默认shell执行,因为行
#/bin/sh
将被视为一个简单的注释,并被忽略

例如:

foo.py:

#! /usr/local/bin/python

a = 5
for i in range(10): print i
文件的执行是正确的

$ sh -c ./foo.py
0
1
2
3
4
但是文件内容的执行会导致错误,因为shebang(
#!
)被视为一个mete注释:

$ sh -c '#! /usr/local/bin/python

a = 10
for i in range(10): print i
'
a: not found
Syntax error: "(" unexpected

我认为您想要的是将文件名传递给脚本,对吗

p = src.popen( ['sh', './timer.sh', 'filename.txt'], stdout=subprocess.PIPE )
在剧本里呢

FILENAME="$1"
....
nc 10.0.0.7 1234 < "$FILENAME"
sh-c
告诉shell以文本形式执行下一个命令。请注意,您不需要
shell=True
,因为您不需要对代码进行任何解析

编辑2:

这就是你回答得太快的原因。您确实可以通过这种方式将完整的shell脚本传递给shell。只是不要做任何逃跑的事(并且可能要摆脱shebang):


我认为您想要的是将文件名传递给脚本,对吗

p = src.popen( ['sh', './timer.sh', 'filename.txt'], stdout=subprocess.PIPE )
在剧本里呢

FILENAME="$1"
....
nc 10.0.0.7 1234 < "$FILENAME"
sh-c
告诉shell以文本形式执行下一个命令。请注意,您不需要
shell=True
,因为您不需要对代码进行任何解析

编辑2:

这就是你回答得太快的原因。您确实可以通过这种方式将完整的shell脚本传递给shell。只是不要做任何逃跑的事(并且可能要摆脱shebang):


我认为您想要的是将文件名传递给脚本,对吗

p = src.popen( ['sh', './timer.sh', 'filename.txt'], stdout=subprocess.PIPE )
在剧本里呢

FILENAME="$1"
....
nc 10.0.0.7 1234 < "$FILENAME"
sh-c
告诉shell按指示执行下一个命令