相关疑难解决方法(0)

'b'字符在字符串文字前面做了什么?

显然,以下是有效的语法

my_string = b'The string'
Run Code Online (Sandbox Code Playgroud)

我想知道:

  1. 这是什么b字在前面的字符串是什么意思?
  2. 使用它有什么影响?
  3. 使用它的适当情况是什么?

我在SO上找到了一个相关的问题,但是这个问题是关于PHP的,它表示b用于表示字符串是二进制的,而不是Unicode,这是代码与PHP版本兼容所需的代码<6 ,当迁移到PHP 6.我不认为这适用于Python.

我确实在Python网站上找到了关于使用相同语法的字符将字符串指定为Unicode的文档u.不幸的是,它没有提到该文档中任何地方的b字符.

而且,只是出于好奇,有没有比多符号bu是做其他事情?

python string unicode binary

724
推荐指数
10
解决办法
49万
查看次数

逐行读取子进程标准输出

我的python脚本使用subprocess来调用非常嘈杂的linux实用程序.我想将所有输出存储到日志文件中并向用户显示一些输出.我认为以下内容可行,但在实用程序产生大量输出之前,输出不会显示在我的应用程序中.

#fake_utility.py, just generates lots of output over time
import time
i = 0
while True:
   print hex(i)*512
   i += 1
   time.sleep(0.5)

#filters output
import subprocess
proc = subprocess.Popen(['python','fake_utility.py'],stdout=subprocess.PIPE)
for line in proc.stdout:
   #the real code does filtering here
   print "test:", line.rstrip()
Run Code Online (Sandbox Code Playgroud)

我真正想要的行为是过滤器脚本在从子进程接收时打印每一行.Sorta就像tee使用python代码一样.

我错过了什么?这甚至可能吗?


更新:

如果将a sys.stdout.flush()添加到fake_utility.py,则代码在python 3.1中具有所需的行为.我正在使用python 2.6.您会认为使用proc.stdout.xreadlines()将与py3k一样工作,但事实并非如此.


更新2:

这是最小的工作代码.

#fake_utility.py, just generates lots of output over time
import sys, time
for i in range(10):
   print i
   sys.stdout.flush()
   time.sleep(0.5)

#display out put line by …
Run Code Online (Sandbox Code Playgroud)

python subprocess

216
推荐指数
8
解决办法
32万
查看次数

从subprocess.communicate()读取流输入

我正在使用Python subprocess.communicate()来从一个运行大约一分钟的进程中读取stdout.

如何stdout以流式方式打印出该流程的每一行,以便我可以看到生成的输出,但在继续之前仍然阻止流程终止?

subprocess.communicate() 似乎立刻提供所有输出.

python subprocess

75
推荐指数
3
解决办法
7万
查看次数

从子进程实时捕获stdout

我想subprocess.Popen()在Windows中使用rsync.exe,并在Python中打印stdout.

我的代码有效,但在文件传输完成之前它没有抓住进度!我想实时打印每个文件的进度.

现在使用Python 3.1,因为我听说它应该更好地处理IO.

import subprocess, time, os, sys

cmd = "rsync.exe -vaz -P source/ dest/"
p, line = True, 'start'


p = subprocess.Popen(cmd,
                     shell=True,
                     bufsize=64,
                     stdin=subprocess.PIPE,
                     stderr=subprocess.PIPE,
                     stdout=subprocess.PIPE)

for line in p.stdout:
    print(">>> " + str(line.rstrip()))
    p.stdout.flush()
Run Code Online (Sandbox Code Playgroud)

python subprocess stdout

74
推荐指数
9
解决办法
10万
查看次数

如何捕获Python subprocess.check_output()的异常输出?

我正在尝试从Python中进行比特币支付.在bash中我通常会这样做:

bitcoin sendtoaddress <bitcoin address> <amount>
Run Code Online (Sandbox Code Playgroud)

例如:

bitcoin sendtoaddress 1HoCUcbK9RbVnuaGQwiyaJGGAG6xrTPC9y 1.4214
Run Code Online (Sandbox Code Playgroud)

如果它是成功的我得到一个事务ID作为输出,但如果我尝试转移大于我的比特币余额的数量,我得到以下输出:

error: {"code":-4,"message":"Insufficient funds"}
Run Code Online (Sandbox Code Playgroud)

在我的Python程序中,我现在尝试按以下方式进行付款:

import subprocess

try:
    output = subprocess.check_output(['bitcoin', 'sendtoaddress', address, str(amount)])
except:
    print "Unexpected error:", sys.exc_info()
Run Code Online (Sandbox Code Playgroud)

如果有足够的余额它可以正常工作,但如果没有足够的余额sys.exc_info()打印出来:

(<class 'subprocess.CalledProcessError'>, CalledProcessError(), <traceback object at 0x7f339599ac68>)
Run Code Online (Sandbox Code Playgroud)

它不包括我在命令行上得到的错误.所以我的问题是; 如何{"code":-4,"message":"Insufficient funds"}从Python中获取输出的错误()?

欢迎所有提示!

python bash subprocess

55
推荐指数
7
解决办法
10万
查看次数

如何从subprocess.Popen中获取'实时'信息在python(2.5)中

我想以下列方式使用子进程模块:

  1. 创建一个可能需要很长时间才能执行的新流程.
  2. 捕获stdout(或者stderr,或者两者一起或分别捕获)
  3. 处理来自子进程的数据,可能在接收的每一行上触发事件(在wxPython中说)或者只是暂时将它们打印出来.

我已经用Popen创建了进程,但是如果我使用communication(),那么一旦进程终止,数据就会立刻出现在我面前.

如果我创建一个单独的线程,做了阻塞readline()myprocess.stdout(使用stdout = subprocess.PIPE)我不明白这种方法的任何行或者,直到进程终止.(无论我设置为bufsize)

有没有办法解决这个不可怕的问题,并且在多个平台上运行良好?

python subprocess stdout popen

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

如何从subprocess.Popen()获取输出.proc.stdout.readline()块,没有数据打印出来

我想从执行Test_Pipe.py输出,我尝试在Linux上使用代码,但它没有用.

Test_Pipe.py

import time
while True :
    print "Someting ..."
    time.sleep(.1)
Run Code Online (Sandbox Code Playgroud)

Caller.py

import subprocess as subp
import time

proc = subp.Popen(["python", "Test_Pipe.py"], stdout=subp.PIPE, stdin=subp.PIPE)

while True :
    data = proc.stdout.readline() #block / wait
    print data
    time.sleep(.1)
Run Code Online (Sandbox Code Playgroud)

该行proc.stdout.readline()被阻止,因此没有数据打印出来.

python linux subprocess popen

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

如何抑制subprocess.run()的输出?

从文档中的示例subprocess.run()来看,似乎不应该有任何输出

subprocess.run(["ls", "-l"])  # doesn't capture output
Run Code Online (Sandbox Code Playgroud)

但是,当我在python shell中尝试它时,列表被打印出来.我想知道这是否是默认行为以及如何抑制输出run().

python subprocess python-3.x

22
推荐指数
2
解决办法
2万
查看次数

实时读取stdout进程

让我们考虑一下这个片段:

from subprocess import Popen, PIPE, CalledProcessError


def execute(cmd):
    with Popen(cmd, shell=True, stdout=PIPE, bufsize=1, universal_newlines=True) as p:
        for line in p.stdout:
            print(line, end='')

    if p.returncode != 0:
        raise CalledProcessError(p.returncode, p.args)

base_cmd = [
    "cmd", "/c", "d:\\virtual_envs\\py362_32\\Scripts\\activate",
    "&&"
]
cmd1 = " ".join(base_cmd + ['python -c "import sys; print(sys.version)"'])
cmd2 = " ".join(base_cmd + ["python -m http.server"])
Run Code Online (Sandbox Code Playgroud)

如果我运行execute(cmd1)输出将打印没有任何问题.

但是,如果我运行execute(cmd2)而不会打印任何内容,为什么会这样,我如何修复它,以便我可以实时看到http.server的输出.

另外,如何for line in p.stdout在内部进行评估?是什么样的无限循环,直到达到stoout eof或什么?

这个主题在SO中已经解决了几次,但我还没有找到一个Windows解决方案.上面的片段实际上是来自这个答案的代码并尝试从virtualenv运行http.server(在win7上运行python3.6.2-32bits)

python windows subprocess popen sublimetext3

17
推荐指数
2
解决办法
2065
查看次数

从子进程读取流

我需要在子进程生成时读取它的输出 - 可能不会在每个进程上读取write,但是在进程完成之前.我在这里这里尝试过Python3文档和SO问题的解决方案,但是在孩子终止之前我仍然没有得到任何结果.

该应用程序用于监控深度学习模型的培训.我需要获取测试输出(每次迭代大约250个字节,间隔大约1分钟)并观察统计故障.

  • 我无法改变训练引擎; 例如,我无法stdout.flush()在子进程代码中插入.
  • 我可以合理地等待十几行输出积累; 我希望缓冲填充解决我的问题.

代码:变体被注释掉了.

cmd = ["/usr/bin/python3", "zzz.py"]
# test_proc = subprocess.Popen(
test_proc = subprocess.run(
    cmd,
    stdout=subprocess.PIPE,
    stderr=subprocess.STDOUT
    )

out_data = ""
print(time.time(), "START")
while not "QUIT" in str(out_data):
    out_data = test_proc.stdout
    # out_data, err_data = test_proc.communicate()
    print(time.time(), "MAIN received", out_data)
Run Code Online (Sandbox Code Playgroud)

孩子(zzz.py)

from time import sleep
import sys

for _ in range(5):
    print(_, "sleeping", "."*1000)
    # sys.stdout.flush()
    sleep(1)

print("QUIT this exercise")
Run Code Online (Sandbox Code Playgroud)

尽管发送了1000多个字节的行,缓冲区(在别处测试为2kb;这里,我已经高达50kb)填充不会导致父级"看到"新文本.

为了让这个工作,我错过了什么?


关于链接,评论和iBug发布的答案的更新: …

subprocess python-3.x

11
推荐指数
1
解决办法
156
查看次数