相关疑难解决方法(0)

写错误:管道坏了

我必须在大约300个目录上运行一个工具.每次运行大约需要1分钟到30分钟甚至更长时间.所以,我写了一个python脚本,有一个循环,一个接一个地在所有目录上运行该工具.

我的python脚本有类似的代码:

for directory in directories:
  os.popen('runtool_exec ' + directory)
Run Code Online (Sandbox Code Playgroud)

但是当我运行python脚本时,我反复收到以下错误消息:

..
tail: write error: Broken pipe
date: write error: Broken pipe
..
Run Code Online (Sandbox Code Playgroud)

我所做的就是使用ssh登录远程服务器,其中保存工具,python脚本和主题目录.当我使用以下命令从命令提示符单独运行该工具时:

runtool_exec directory
Run Code Online (Sandbox Code Playgroud)

它工作正常.只有当我使用python脚本运行时,"破管"错误才会出现.任何想法,解决方法?

python unix linux scripting

4
推荐指数
1
解决办法
1万
查看次数

'yes'与子进程通信报告错误()

我使用以下函数在Python中运行命令:

def run_proc(cmd):
    child = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
    stdout, stderr = child.communicate()
    returncode = child.returncode
    return stdout, stderr, returncode
Run Code Online (Sandbox Code Playgroud)

它一直工作正常,但现在我正在尝试使用该yes程序将输出管道输出到stdin.我正在尝试运行的命令如下:

yes '' | apt-get -y -o Dpkg::Options::="--force-confdef" -o Dpkg::Options::="--force-confold" dist-upgrade
Run Code Online (Sandbox Code Playgroud)

但我相信它可以用一般的例子代替,例如:

yes | head -3 | cat
Run Code Online (Sandbox Code Playgroud)

我的问题是,如果我尝试运行其中的任何命令yes |,上面的subprocess.Popen将包含错误消息:

yes: standard output: Broken pipe
yes: write error
Run Code Online (Sandbox Code Playgroud)

对我来说,似乎管道仍然可以工作,从yes | head -3 | cat答案中可以看出:y y y.

我有以下问题:

  1. 是的管道是否仍然可用,即使是报告错误?
  2. 我该如何解决?

python linux shell command-line subprocess

4
推荐指数
1
解决办法
2015
查看次数

为什么不在Python的subprocess.Popen中使用`shell = True`?

我有一个很长的单行shell命令可以被Python调用.代码是这样的:

# "first way"
def run_cmd ( command ):
    print "Run: %s" % command
    subprocess.call (command, shell=True)
run_cmd('''sort -n -r -k5 {3} |head -n 500|awk 'OFS="\t"{{if($2-{1}>0){{print $1,$2-{1},$3+{1},$4,$5}}}}' > {2}'''.format(top_count,extend/2,mid,summit))
Run Code Online (Sandbox Code Playgroud)

这些代码有效,但总是这样抱怨:

sort: write failed: standard output: Broken pipe
sort: write error
awk: (FILENAME=- FNR=132) fatal: print to "standard output" failed (Broken pipe)
Run Code Online (Sandbox Code Playgroud)

根据之前的回答,我需要使用更长的脚本来完成此操作,例如:

# "second way"
p1 = Popen("sort -n -r -k5 %s"%summit, stdout=PIPE)
p2 = Popen("head -n 500", stdin=p1.stdout, stdout=PIPE)
# and so on ..........
Run Code Online (Sandbox Code Playgroud)

我的问题是:

(1)"第二路"是否比"第一路"慢

(2)如果我必须以"第一路"写作(因为它写得更快),我怎么能避免这样的抱怨 …

python linux shell subprocess process

3
推荐指数
1
解决办法
4191
查看次数

标签 统计

linux ×3

python ×3

shell ×2

subprocess ×2

command-line ×1

process ×1

scripting ×1

unix ×1