显然,以下是有效的语法
my_string = b'The string'
Run Code Online (Sandbox Code Playgroud)
我想知道:
b字在前面的字符串是什么意思?我在SO上找到了一个相关的问题,但是这个问题是关于PHP的,它表示b用于表示字符串是二进制的,而不是Unicode,这是代码与PHP版本兼容所需的代码<6 ,当迁移到PHP 6.我不认为这适用于Python.
我确实在Python网站上找到了关于使用相同语法的字符将字符串指定为Unicode的文档u.不幸的是,它没有提到该文档中任何地方的b字符.
而且,只是出于好奇,有没有比多符号b和u是做其他事情?
我的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.communicate()来从一个运行大约一分钟的进程中读取stdout.
如何stdout以流式方式打印出该流程的每一行,以便我可以看到生成的输出,但在继续之前仍然阻止流程终止?
subprocess.communicate() 似乎立刻提供所有输出.
我想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中进行比特币支付.在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中获取输出的错误()?
欢迎所有提示!
我想以下列方式使用子进程模块:
stdout(或者stderr,或者两者一起或分别捕获)我已经用Popen创建了进程,但是如果我使用communication(),那么一旦进程终止,数据就会立刻出现在我面前.
如果我创建一个单独的线程,做了阻塞readline()的myprocess.stdout(使用stdout = subprocess.PIPE)我不明白这种方法的任何行或者,直到进程终止.(无论我设置为bufsize)
有没有办法解决这个不可怕的问题,并且在多个平台上运行良好?
我想从执行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()被阻止,因此没有数据打印出来.
从文档中的示例subprocess.run()来看,似乎不应该有任何输出
subprocess.run(["ls", "-l"]) # doesn't capture output
Run Code Online (Sandbox Code Playgroud)
但是,当我在python shell中尝试它时,列表被打印出来.我想知道这是否是默认行为以及如何抑制输出run().
让我们考虑一下这个片段:
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)
我需要在子进程生成时读取它的输出 - 可能不会在每个进程上读取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发布的答案的更新: …
python ×9
subprocess ×9
popen ×3
python-3.x ×2
stdout ×2
bash ×1
binary ×1
linux ×1
string ×1
sublimetext3 ×1
unicode ×1
windows ×1