如何在Python脚本中调用外部命令(就像我在Unix shell或Windows命令提示符下键入它一样)?
编辑:因为似乎没有解决方案,或者我正在做一些没人知道的非标准的东西 - 我会修改我的问题也要问:当python应用程序创建时,完成日志记录的最佳方法是什么很多系统调用?
我的应用程序有两种模式.在交互模式下,我希望所有输出都转到屏幕以及日志文件,包括来自任何系统调用的输出.在守护程序模式下,所有输出都将转到日志中.守护进程模式很好用os.dup2().我无法找到一种方法将所有输出"发送"到交互模式的日志,而无需修改每个系统调用.
换句话说,我想要命令行'tee'的功能,用于python应用程序生成的任何输出,包括系统调用输出.
澄清:
要重定向所有输出,我会做这样的事情,并且效果很好:
# open our log file
so = se = open("%s.log" % self.name, 'w', 0)
# re-open stdout without buffering
sys.stdout = os.fdopen(sys.stdout.fileno(), 'w', 0)
# redirect stdout and stderr to the log file opened above
os.dup2(so.fileno(), sys.stdout.fileno())
os.dup2(se.fileno(), sys.stderr.fileno())
Run Code Online (Sandbox Code Playgroud)
关于这一点的好处是它不需要来自其余代码的特殊打印调用.该代码还运行一些shell命令,因此不必单独处理每个输出.
简单地说,我想做同样的事情,除了重复而不是重定向.
起初以为我认为简单地扭转它们dup2应该有效.为什么不呢?这是我的测试:
import os, sys
### my broken solution:
so = se = open("a.log", 'w', 0)
sys.stdout = os.fdopen(sys.stdout.fileno(), 'w', 0)
os.dup2(sys.stdout.fileno(), so.fileno())
os.dup2(sys.stderr.fileno(), se.fileno()) …Run Code Online (Sandbox Code Playgroud) 我得到了一个
UnicodeEncodeError: 'ascii' codec can't encode character u'\xa3' in position 34: ordinal not in range(128)
Run Code Online (Sandbox Code Playgroud)
存储在'a.desc'中的字符串,因为它包含'£'字符.它作为unicode字符串存储在底层Google App Engine数据存储区中,因此没问题.cStringIO.StringIO.writelines函数试图似乎试图以ascii格式对其进行编码:
result.writelines(['blahblah',a.desc,'blahblahblah'])
Run Code Online (Sandbox Code Playgroud)
如果这是正确的措辞,我如何指示它将编码视为unicode?
app引擎在python 2.5上运行
你想unittest为这样的函数编写-cases:
def test_me(a):
for b in c:
print do_something(a,b)
Run Code Online (Sandbox Code Playgroud)
起初我想过只收集do_something字符串中的输出然后返回它,一起打印和测试整个输出.但它并不总是很方便,因为这样的循环可能会导致缓冲区字符串变得非常大,具体取决于具体情况.那么,在打印并且不返回输出时,您可以做些什么来测试输出?
我正在编写一些代码来报告和协调两个pip管理的python安装之间的差异.
如何在pip list不进行子程序调用pip的情况下以编程方式获取所提供的信息?
有没有办法在python argparse的描述文本后打印用法文本?我有我的cmd行argparse工作,但我想在使用信息之前打印版本信息.
编辑:
version: 1.0
usage: blahcmd [-h] [-help]
some lovely help
Run Code Online (Sandbox Code Playgroud) 我试图分析一些混乱的代码,碰巧在函数中使用全局变量(我试图重构代码,以便函数只使用局部变量).有没有办法检测函数中的全局变量?
例如:
def f(x):
x = x + 1
z = x + y
return z
Run Code Online (Sandbox Code Playgroud)
这里全局变量是y因为它不是作为参数给出的,也不是在函数中创建的.
我尝试使用字符串解析检测函数中的全局变量,但它有点乱; 我想知道是否有更好的方法来做到这一点?
编辑:如果有人感兴趣,这是我用来检测全局变量的代码(基于kindall的答案和Paolo对这个问题的回答:从Python中的脚本捕获stdout):
from dis import dis
def capture(f):
"""
Decorator to capture standard output
"""
def captured(*args, **kwargs):
import sys
from cStringIO import StringIO
# setup the environment
backup = sys.stdout
try:
sys.stdout = StringIO() # capture output
f(*args, **kwargs)
out = sys.stdout.getvalue() # release output
finally:
sys.stdout.close() # close the stream
sys.stdout = backup # restore original …Run Code Online (Sandbox Code Playgroud) logSnakemake 允许使用指定日志文件名称的参数为每个规则创建日志。将输出结果通过管道传输到此日志相对简单shell,但我无法找出记录输出输出的方法run(即 python 脚本)。
一种解决方法是将 python 代码保存在脚本中,然后从 shell 运行它,但我想知道是否还有另一种方法?
我有一个函数可以将一些随机字符串打印到控制台,例如:
from random import choice
def hello():
print(f"Hello {choice(('Guido', 'Raymond'))}!")
Run Code Online (Sandbox Code Playgroud)
请注意,我的实际功能比这更复杂。随机部分是对数据库的请求,可能成功也可能失败。这意味着我无法初始化种子以获得恒定的结果。
我尝试的是使用省略号,但我还需要添加一个丑陋的注释,以便 doctest 识别它。
def hello():
"""
>>> hello() # doctest: +ELLIPSIS
Hello ...!
"""
print(f"Hello {choice(('Guido', 'Raymond'))}!")
Run Code Online (Sandbox Code Playgroud)
在这种情况下有更好的策略吗?
例如,如果我可以测试答案是否为Hello Guido!和之间的一个,而不是省略号,那就太好了Hello Raymond!。
当我使用 pylint 时:
import pylint.lint
options = [
filename,
"--output-format=json"
]
results = pylint.lint.Run(options, do_exit=False)
messages = results.linter.reporter.messages
Run Code Online (Sandbox Code Playgroud)
我的messages变量具有正确的信息JSON。但是,pylint 会JSON在控制台中打印消息...
我怎样才能防止print()pylint?
此选项不起作用:
options = [
filename,
"--output-format=json",
"--reports=no" # Tells whether to display a full report or only the messages.
]
Run Code Online (Sandbox Code Playgroud)
见https://pylint.readthedocs.io/en/stable/technical_reference/features.html#reports-options
谁能告诉我如何将命令的输出设置为变量?
基本上,我正在寻找与此bash示例等效的Python:
blah="ajsdlk akajl <ajksd@ajksldf.com>"
blah=$(echo "$blah" | cut -d '<' -f 2 | cut -d '>' -f 1)
echo "$blah"
ajksd@ajksldf.com
Run Code Online (Sandbox Code Playgroud)