您可以通过以下方式从字符串创建原始字符串
test_file=open(r'c:\Python27\test.txt','r')
Run Code Online (Sandbox Code Playgroud)
如何从字符串变量创建原始变量,例如
path = 'c:\Python27\test.txt'
test_file=open(rpath,'r')
Run Code Online (Sandbox Code Playgroud)
因为我有一个文件路径:
file_path = "C:\Users\b_zz\Desktop\my_file"
Run Code Online (Sandbox Code Playgroud)
当我做:
data_list = open(os.path.expandvars(file_path),"r").readlines()
Run Code Online (Sandbox Code Playgroud)
我明白了:
Traceback (most recent call last):
File "<pyshell#32>", line 1, in <module>
scheduled_data_list = open(os.path.expandvars(file_path),"r").readlines()
IOError: [Errno 22] invalid mode ('r') or filename: 'C:\\Users\x08_zz\\Desktop\\my_file'
Run Code Online (Sandbox Code Playgroud) logSnakemake 允许使用指定日志文件名称的参数为每个规则创建日志。将输出结果通过管道传输到此日志相对简单shell,但我无法找出记录输出输出的方法run(即 python 脚本)。
一种解决方法是将 python 代码保存在脚本中,然后从 shell 运行它,但我想知道是否还有另一种方法?
在这里参考这个问题:LINK 如何设置一个配置,它只会记录我的根脚本和我自己的子脚本?链接的问题要求禁用所有导入的模块,但这不是我的意图。
我的根设置:
import logging
from exchangehandler import send_mail
log_wp = logging.getLogger(__name__)
logging.basicConfig(level=logging.DEBUG,
format='%(asctime)s - %(levelname)s [%(filename)s]: %(name)s %(funcName)20s - Message: %(message)s',
datefmt='%d.%m.%Y %H:%M:%S',
filename='C:/log/myapp.log',
filemode='a')
handler = logging.StreamHandler()
log_wp.addHandler(handler)
log_wp.debug('This is from root')
send_mail('address@eg.com', 'Request', 'Hi there')
Run Code Online (Sandbox Code Playgroud)
我的子模块 exchangehandler.py:
import logging
log_wp = logging.getLogger(__name__)
def send_mail(mail_to,mail_subject,mail_body, mail_attachment=None):
log_wp.debug('Hey this is from exchangehandler.py!')
m.send_and_save()
Run Code Online (Sandbox Code Playgroud)
我的应用程序日志:
16.07.2018 10:27:40 - DEBUG [test_script.py]: __main__ <module> - Message: This is from root
16.07.2018 10:28:02 - DEBUG [exchangehandler.py]: exchangehandler send_mail - …Run Code Online (Sandbox Code Playgroud) 我想将 Python 脚本的标准错误和标准输出重定向到同一个输出文件。从我可以使用的终端
$ python myfile.py &> out.txt
Run Code Online (Sandbox Code Playgroud)
完成我想要的相同任务,但我需要从 Python 脚本本身完成它。
我调查了Redirect subprocess stderr to stdout,How to redirect stderr in Python? 和示例 10.10 从这里开始,然后我尝试了以下操作:
import sys
fsock = open('out.txt', 'w')
sys.stdout = sys.stderr = fsock
print "a"
Run Code Online (Sandbox Code Playgroud)
它正确地在文件 out.txt 中打印了字母“a”;但是,当我尝试以下操作时:
import sys
fsock = open('out.txt', 'w')
sys.stdout = sys.stderr = fsock
print "a # missing end quote, will give error
Run Code Online (Sandbox Code Playgroud)
我在终端上收到错误消息“SyntaxError ...”,但在文件 out.txt 中没有。我需要做什么才能将 SyntaxError 发送到文件 out.txt?我不想写异常,因为那样的话我必须在脚本中写太多异常。我正在使用 Python 2.7。
更新:正如下面的答案和评论中所指出的,SyntaxError 将始终输出到屏幕,我替换了该行
print "a # missing …Run Code Online (Sandbox Code Playgroud) 这是我最近两个问题的组合:
[1] C中的Python实例方法
[2] 如何在Python中重定向stderr?
我想从python脚本中记录stdout和stderr的输出.
我想问的是,根据[1]创建一个新类型似乎相当复杂.如果不需要将新类型公开给Python,它是否简化了事情,即它只存在于C中?
我的意思是,当Python打印出来时会转到"Objects/fileobject.c",而在"PyFile_WriteObject"中它会检查是否可以写入其参数:
writer = PyObject_GetAttrString(f, "write");
if (writer == NULL)
...
Run Code Online (Sandbox Code Playgroud)
此外,有可能像这样得到stdout和stderr:
PyObject* out = PySys_GetObject("stdout");
PyObject* err = PySys_GetObject("stderr");
Run Code Online (Sandbox Code Playgroud)
我的问题是,是否有可能构造必要的PyObject,它满足上面的'PyObject_GetAttrString(f,"write")'并且可以调用,所以我可以写:
PySys_SetObject("stdout", <my writer object / class / type / ?>);
Run Code Online (Sandbox Code Playgroud)
http://docs.python.org/c-api/sys.html?highlight=pysys_setobject#PySys_SetObject
这样,就没有必要将新的"writer类型"暴露给Python脚本的其余部分,所以我认为编写代码可能有点简单......?
我使用匿名管道来捕获所有stdout,然后stderr打印成一个richedit,当我使用wsprintf时它没关系,但使用多字节char的python真的让我恼火.如何将所有这些输出转换为unicode?
更新2010-01-03:
谢谢你的回复,但它似乎str.encode()唯一适用的print xxx东西,如果在期间有错误py_runxxx(),我的重定向stderr将捕获多字节字符串中的错误消息,所以有没有办法可以使python以unicode方式输出它的消息?在这篇文章中似乎有一个可用的解决方案.
我稍后再试.
使用 python logging 包,并编写一个类 Log,我想将 stdout 和 stderr 发送到日志文件:
log = Log("log.txt")
print "line1"
print "line2"
print >>sys.stderr, "err1"
del log
print "line to screen only"
Run Code Online (Sandbox Code Playgroud)
输出日志文件将包含:
16/11/2017 09:51:58 INFO - line1
16/11/2017 09:51:58 INFO - line2
16/11/2017 09:51:58 INFO - err1
Run Code Online (Sandbox Code Playgroud)
知道如何编写这个 Log 类,保持“日志”包(时间戳,...)的优势吗?