相关疑难解决方法(0)

在Python中调用外部命令

如何在Python脚本中调用外部命令(就像我在Unix shell或Windows命令提示符下键入它一样)?

python shell terminal command subprocess

4553
推荐指数
57
解决办法
325万
查看次数

如何将sys.stdout复制到日志文件?

编辑:因为似乎没有解决方案,或者我正在做一些没人知道的非标准的东西 - 我会修改我的问题也要问:当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)

python tee

140
推荐指数
11
解决办法
10万
查看次数

Python:如何让StringIO.writelines接受unicode字符串?

我得到了一个

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上运行

python string unicode ascii stringio

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

如何测试打印报表?

你想unittest为这样的函数编写-cases:

def test_me(a):
    for b in c:
        print do_something(a,b)
Run Code Online (Sandbox Code Playgroud)

起初我想过只收集do_something字符串中的输出然后返回它,一起打印和测试整个输出.但它并不总是很方便,因为这样的循环可能会导致缓冲区字符串变得非常大,具体取决于具体情况.那么,在打印并且不返回输出时,您可以做些什么来测试输出?

python unit-testing stdout

18
推荐指数
2
解决办法
8612
查看次数

Python:以编程方式运行"pip list"

我正在编写一些代码来报告和协调两个pip管理的python安装之间的差异.

如何在pip list不进行子程序调用pip的情况下以编程方式获取所提供的信息?

python pip

15
推荐指数
2
解决办法
3895
查看次数

描述后的python argparse打印用法文本

有没有办法在python argparse的描述文本后打印用法文本?我有我的cmd行argparse工作,但我想在使用信息之前打印版本信息.

编辑:

version: 1.0

usage: blahcmd [-h] [-help] 

some lovely help
Run Code Online (Sandbox Code Playgroud)

python argparse

10
推荐指数
2
解决办法
4426
查看次数

检测python函数中的所有全局变量?

我试图分析一些混乱的代码,碰巧在函数中使用全局变量(我试图重构代码,以便函数只使用局部变量).有没有办法检测函数中的全局变量?

例如:

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)

python function global-variables

7
推荐指数
1
解决办法
784
查看次数

Snakemake:使用run指令时如何实现log指令?

logSnakemake 允许使用指定日志文件名称的参数为每个规则创建日志。将输出结果通过管道传输到此日志相对简单shell,但我无法找出记录输出输出的方法run(即 python 脚本)。

一种解决方法是将 python 代码保存在脚本中,然后从 shell 运行它,但我想知道是否还有另一种方法?

snakemake

6
推荐指数
1
解决办法
1788
查看次数

具有随机输出的函数的文档测试

我有一个函数可以将一些随机字符串打印到控制台,例如:

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!

python doctest

5
推荐指数
1
解决办法
97
查看次数

Pylint:如何防止打印

当我使用 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

python pylint python-3.x

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

将命令集结果执行为变量

谁能告诉我如何将命令的输出设置为变量?

基本上,我正在寻找与此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)

python

-1
推荐指数
1
解决办法
81
查看次数