有没有办法让 python 输出到 shell 并同时输出到变量中的 str ?
Is there a way to get python to output to the shell and simultaneously output to str in a variable?
我在 python 中找到的将控制台输出重定向到变量中的字符串的唯一方法似乎也关闭了以类似于 python 会正常输出代码。
我目前正在更改 sys.stdout 但同样,这似乎是其中之一。
如果我重新定义它,我将获得完美的远程错误检查性能,因为我能够在异常处理事件中将输出变量保存到基于云的电子表格中,无论我身在何处,它都会向我发送通知。
但是,重新定义它意味着我不能在“运行 顺利”
时来本地检查程序的输出
编辑:您的一些回答帮助我完善了我的问题。这是一个新的重新措辞:
在不覆盖的情况下将元素打印到控制台时,使用单个变量简洁地存储和记录输出的最佳方法是什么 sys.stdout?
old_stdout = sys.stdout
new_stdout = io.StringIO()
sys.stdout = new_stdout
def update_error_log_ss(traceback_, summary, output = ""):
print("Connecting to Smart Sheet to Update Error Log")
token = 'token'
error_log_sheetid = 00000000
ss_client = ss.Smartsheet(token)
now = datetime.datetime.now()
sheet = ss_client.Sheets.get_sheet(error_log_sheetid)
colid = []
for col in sheet.columns:
colid.append(col.id)
print(str(col.id) + " - " + col.title)
totalcols = len(colid)
row_add = ss.models.Row()
row_add.to_top = True
row_add.cells.append({
'column_id': colid[0],
'value': str(now)
})
row_add.cells.append({
'column_id': colid[1],
'value': summary
})
row_add.cells.append({
'column_id': colid[2],
'value': traceback_
})
row_add.cells.append({
'column_id': colid[3],
'value': output
})
response = ss_client.Sheets.add_rows(
error_log_sheetid,
[row_add]
)
return
except Exception:
if debug_ == False:
synch.update_error_log_ss(traceback.format_exc(),'initialization failure',new_stdout.getvalue())
main_()
else:
synch.update_error_log_ss(traceback.format_exc(),'initialization failure')
main_()
我对上述解决方案的唯一问题是,为了定义 new_stdout.getvalue(),必须覆盖 sys.stdout
也许你想要这个:
def get(x):
print(x)
return x
myvar = get('myvalue')
print(myvar)
输出:
myvalue
myvalue
所以基本上只需编写自己的函数来打印值,然后 return 将其输出到变量。
根据 print
docs:
The file argument must be an object with a write(string)
method
因此您可以根据需要创建一个并将其分配给 sys.stdout
,这是 print
:
的默认 file
参数
import io
import sys
class my_stdout:
def __init__(self):
self.real_stdout = sys.stdout
self.new_stdout = io.StringIO()
def write(self, s):
self.real_stdout.write(s)
self.new_stdout.write(s)
def getvalue(self):
return self.new_stdout.getvalue()
new_stdout = my_stdout()
sys.stdout = new_stdout
print("Original: Hello world!")
# for debug:
sys.stdout = new_stdout.real_stdout
print("From stringio:", new_stdout.getvalue())
输出:
Original: Hello world!
From stringio: Original: Hello world!
我在 python 中找到的将控制台输出重定向到变量中的字符串的唯一方法似乎也关闭了以类似于 python 会正常输出代码。
我目前正在更改 sys.stdout 但同样,这似乎是其中之一。
如果我重新定义它,我将获得完美的远程错误检查性能,因为我能够在异常处理事件中将输出变量保存到基于云的电子表格中,无论我身在何处,它都会向我发送通知。
但是,重新定义它意味着我不能在“运行 顺利”
时来本地检查程序的输出编辑:您的一些回答帮助我完善了我的问题。这是一个新的重新措辞:
在不覆盖的情况下将元素打印到控制台时,使用单个变量简洁地存储和记录输出的最佳方法是什么 sys.stdout?
old_stdout = sys.stdout
new_stdout = io.StringIO()
sys.stdout = new_stdout
def update_error_log_ss(traceback_, summary, output = ""):
print("Connecting to Smart Sheet to Update Error Log")
token = 'token'
error_log_sheetid = 00000000
ss_client = ss.Smartsheet(token)
now = datetime.datetime.now()
sheet = ss_client.Sheets.get_sheet(error_log_sheetid)
colid = []
for col in sheet.columns:
colid.append(col.id)
print(str(col.id) + " - " + col.title)
totalcols = len(colid)
row_add = ss.models.Row()
row_add.to_top = True
row_add.cells.append({
'column_id': colid[0],
'value': str(now)
})
row_add.cells.append({
'column_id': colid[1],
'value': summary
})
row_add.cells.append({
'column_id': colid[2],
'value': traceback_
})
row_add.cells.append({
'column_id': colid[3],
'value': output
})
response = ss_client.Sheets.add_rows(
error_log_sheetid,
[row_add]
)
return
except Exception:
if debug_ == False:
synch.update_error_log_ss(traceback.format_exc(),'initialization failure',new_stdout.getvalue())
main_()
else:
synch.update_error_log_ss(traceback.format_exc(),'initialization failure')
main_()
我对上述解决方案的唯一问题是,为了定义 new_stdout.getvalue(),必须覆盖 sys.stdout
也许你想要这个:
def get(x):
print(x)
return x
myvar = get('myvalue')
print(myvar)
输出:
myvalue
myvalue
所以基本上只需编写自己的函数来打印值,然后 return 将其输出到变量。
根据 print
docs:
The file argument must be an object with a
write(string)
method
因此您可以根据需要创建一个并将其分配给 sys.stdout
,这是 print
:
file
参数
import io
import sys
class my_stdout:
def __init__(self):
self.real_stdout = sys.stdout
self.new_stdout = io.StringIO()
def write(self, s):
self.real_stdout.write(s)
self.new_stdout.write(s)
def getvalue(self):
return self.new_stdout.getvalue()
new_stdout = my_stdout()
sys.stdout = new_stdout
print("Original: Hello world!")
# for debug:
sys.stdout = new_stdout.real_stdout
print("From stringio:", new_stdout.getvalue())
输出:
Original: Hello world!
From stringio: Original: Hello world!