小编jer*_*dha的帖子

从Python函数中抑制stdout/stderr打印

我有一个Python脚本,它使用我的雇主提供的一些闭箱Python函数(即我无法编辑这些函数).当我调用这些函数时,它们正在打印输出到我想要压制的linux终端.我尝试过重定向stdout/stderr;

orig_out = sys.stdout
sys.stdout = StringIO()
rogue_function()
sys.stdout = orig_out
Run Code Online (Sandbox Code Playgroud)

但这没有抓住输出.我认为我通过Python调用的函数(上面的rogue_function())实际上是编译C代码的包装器,它们实际上正在进行打印.

有没有人知道我可以通过函数(以及函数调用的任何子函数)对stdout/stderr的任何打印进行"深度捕获"?

更新:

我最终采用了下面选定答案中概述的方法并编写了一个上下文管理器来压制stdout和stderr:

# Define a context manager to suppress stdout and stderr.
class suppress_stdout_stderr(object):
    '''
    A context manager for doing a "deep suppression" of stdout and stderr in 
    Python, i.e. will suppress all print, even if the print originates in a 
    compiled C/Fortran sub-function.
       This will not suppress raised exceptions, since exceptions are printed
    to stderr just before a script exits, and after the context manager …
Run Code Online (Sandbox Code Playgroud)

python stdout

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

Sphinx和argparse - autodocumenting命令行脚本?

我正在构建一个Python包,并使用Sphinx来创建文档.除了我的包代码,我还包括很多使用argparse的命令行Python脚本.我想知道是否有办法让Sphinx自动记录这些脚本?最终目标将是一个漂亮的脚本列表,以及相关的帮助打印,参数和选项.要清楚,我正在寻找一种预先存在的方法来做到这一点,而不是自己实现这一点的方法.

这并不像我通常所问的那样具体,如果有更合适的SE网站发布这个问题,请告诉我.谢谢.

python documentation argparse python-sphinx

27
推荐指数
3
解决办法
3975
查看次数

Matplotlib图例中的文本对齐方式

我试图右键对齐matplotlib轴图例中的条目(默认情况下它们是左对齐的),但似乎无法找到任何方法.我的设置如下:

(我使用ax.plot()命令向my_fig轴添加了数据和标签)

ax = my_fig.get_axes()[0]
legend_font = FontProperties(size=10)
ax.legend(prop=legend_font, num_points=1, markerscale=0.5)
Run Code Online (Sandbox Code Playgroud)

matplotlib Axes的文档中有一个图例关键字参数列表,但似乎没有任何直接的方法来设置图例条目的对齐方式.有人知道这样做的后门方式吗?谢谢.

编辑:

为了澄清我想要实现的目标,现在我的传奇看起来像:

Maneuver: 12-OCT-2011 12:00 UTC 

Bias: 14-OCT-2011 06:00 UTC
Run Code Online (Sandbox Code Playgroud)

我希望它看起来像:

Maneuver: 12-OCT-2011 12:00 UTC 

    Bias: 14-OCT-2011 06:00 UTC
Run Code Online (Sandbox Code Playgroud)

python matplotlib legend

17
推荐指数
2
解决办法
9671
查看次数

reStructuredText/Sphinx中的图像网格

我正在使用Sphinx为我正在开发的Python项目创建文档.我有三张图片,我想在一个1×3格(即所有在同一行)来显示,而我试图找出如何在新结构化做到这一点.现在我有

.. image:: _images/report_title.png

.. image:: _images/report_slide1.png

.. image:: _images/report_slide2.png
Run Code Online (Sandbox Code Playgroud)

我想在一条线上试图围绕它们构建一个reST表,但这看起来有点荒谬.我如何对这些图像进行网格化?

python restructuredtext python-sphinx

17
推荐指数
3
解决办法
8428
查看次数

使用toctree时,防止Python Sphinx中的子部分嵌套

我在构建我的Sphinx用户指南时遇到了问题.我想通过一个包含章节标题和概述的主登陆页面(index.rst)来形成章节,然后分开包含在不同文件中的子章节(part1.rst,part2.rst).我正在尝试使用"toctree"来插入单独的子部分,但是我遇到了一个嵌套问题,我的toctree被吸入了我的概述部分.(注意:我没有使用该..include::指令,因为我希望不同网页上显示的子节顺序链接.我也希望结构正确,以便它们在UG的pdf渲染版本中很好地布局).

index.rst

Chapter 3                                                
===============================                                                 

Overview                                                                        
--------                                                                        

Yadda yadda yadda.

.. toctree::                                                                    
   :hidden:                                                                     

   part1                                                                        
   part2
Run Code Online (Sandbox Code Playgroud)

part1.rst

Part 1
------

This part is all about yadda.
Run Code Online (Sandbox Code Playgroud)

part2.rst

Part 2
------

More yadda.
Run Code Online (Sandbox Code Playgroud)

我希望得到的结构是:

Chapter 3
  - overview
  - part 1
  - part 2
Run Code Online (Sandbox Code Playgroud)

但我得到的是

Chapter 3
  - overview
    - part 1
    - part 2
Run Code Online (Sandbox Code Playgroud)

我在文件底部包含的toctree似乎属于"概述"部分,而不是在主章节上下文中运行.我尝试在文件的顶部插入toctree,但后来我得到了这个顺序:

Chapter 3
  - part 1
  - part 2
  - overview
Run Code Online (Sandbox Code Playgroud)

似乎必须有一种方法可以正确地做到这一点,但我无法在Sphinx网站或SO上找到任何东西.任何帮助表示赞赏.

python restructuredtext python-sphinx

13
推荐指数
1
解决办法
1492
查看次数

运行Python unittest以便在成功时不打印任何内容,只有AssertionError()如果失败

我有一个标准unittest格式的测试模块

class my_test(unittest.TestCase):

    def test_1(self):
        [tests]

    def test_2(self):
        [tests]
  etc....
Run Code Online (Sandbox Code Playgroud)

我的公司有一个专有的测试工具,它将执行我的模块作为命令行脚本,它将捕获我的模块引发的任何错误,但要求我的模块成功时静音.

所以,我试图找到一种方法来裸露运行我的测试模块,这样如果我的所有测试都通过,那么屏幕上什么都没有打印出来,如果测试因AssertionError而失败,那么该错误会通过标准Python错误堆栈传递(就像普通Python脚本中的任何其他错误一样.)

文档提倡使用unittest.main()函数来运行一个给定的模块就像所有的测试

if __name__ == "__main__":
    unittest.main()
Run Code Online (Sandbox Code Playgroud)

问题是,这会将测试结果包含在unittest的线束中,这样即使所有测试都成功,它仍会在屏幕上打印一些绒毛,如果出现错误,它不会简单地转换为通常的python错误,而且穿着马具.

我已经尝试使用输出将输出重定向到备用流

with open('.LOG','a') as logf:
    suite = unittest.TestLoader().loadTestsFromTestCase(my_test)
    unittest.TextTestRunner(stream = logf).run(suite)
Run Code Online (Sandbox Code Playgroud)

这里的问题是,一切都被传送到日志文件(包括所有错误通知).因此,当我的公司利用运行该模块时,它就会成功完成,因为就其所知,没有引发任何错误(因为它们都是通过管道传输到日志文件中).

关于如何构建一个抑制所有漏洞的测试运行器以及通过正常Python错误堆栈管道错误的任何建议?与往常一样,如果您认为有更好的方法来解决这个问题,请告诉我.

编辑:

这是我最终用来解决这个问题.首先,我在我的测试类中添加了一个"get_test_names()"方法:

class my_test(unittest.TestCase):
  etc....
    @staticmethod
    def get_test_names():
        """Return the names of all the test methods for this class."""
        test_names = [ member[0] for memeber in inspect.getmembers(my_test)
                       if 'test_' in member[0] ]
Run Code Online (Sandbox Code Playgroud)

然后我用unittest.main()以下内容替换了我的电话:

# Unittest catches all errors raised by the test cases, and …
Run Code Online (Sandbox Code Playgroud)

python unit-testing

12
推荐指数
1
解决办法
2390
查看次数

matplotlib datetime xlabel问题

我在matplotlib中的日期x轴自动标记中看到了一些奇怪的行为.当我发出命令时:

from datetime import datetime as dt
plot( [ dt(2013, 1, 1), dt(2013, 5, 17)], [ 1 , 1 ], linestyle='None', marker='.')
Run Code Online (Sandbox Code Playgroud)

我得到了非常合理的标签图表:

在此输入图像描述

但如果我将结束日期增加1天:

plot( [ dt(2013, 1, 1), dt(2013, 5, 18)], [ 1 , 1 ], linestyle='None', marker='.')
Run Code Online (Sandbox Code Playgroud)

我明白了:

在此输入图像描述

我在几个不同的日历日期范围转载此(2012年),每一次的幻数跳闸的bug所需的天是约140(在这种情况下一百三十七分之一百三十六).谁知道这里发生了什么?这是一个已知的错误,如果有,是否有解决方法?

一些注意事项:在上面的命令中,我在-pylab模式下使用IPython来创建绘图,但我首先直接使用matplotlib遇到了这个问题,并且它可以在脚本形式中重现(即我不认为这是一个IPython问题).另外,我在matplotlib 1.1.0和1.2.X中都观察到了这一点.

更新:

看起来有一个窗口,如果你向前推得足够远,标签会再次开始正常运行.对于上面的示例,标签从5月18日到5月31日仍然是乱码,但是在6月1日,标签再次开始正常绘图.所以,

(labels are garbled)
plot( [ dt(2013, 1, 1), dt(2013, 5, 31)], [ 1 , 1 ], linestyle='None', marker='.')

(labels are fine)
plot( [ dt(2013, 1, 1), dt(2013, 6, 1)], [ 1 , 1 ], linestyle='None', …
Run Code Online (Sandbox Code Playgroud)

python plot datetime matplotlib

9
推荐指数
1
解决办法
6167
查看次数

在随后的IPython笔记本单元格中重新显示修改后的绘图

我正在使用IPython笔记本创建一个演示.我以pylab内联模式启动笔记本,例如ipython notebook --pylab=inline,我想要做的是逐步构建一个绘图,修改后续单元格中的绘图方面,并在每次修改后重新显示图表.例如,我想要连续的细胞,

CELL 1:

from pandas.io.data import DataReader
from datetime import datetime
import matplotlib.pyplot as plt

goog = DataReader("GOOG",  "yahoo", datetime(2000,1,1), datetime(2012,1,1))
close_vals = goog['Close']
plot(close_vals.index, close_vals.values)

CHART DISPLAYED INLINE
Run Code Online (Sandbox Code Playgroud)

细胞2:

xlim(datetime(2009,1,1), datetime(2010,1,1))

MODIFIED CHART DISPLAYED INLINE
Run Code Online (Sandbox Code Playgroud)

但是,原始图表似乎没有进入后续单元格,并且CELL 2中显示的图表为空.为了通过修改看原始图,我必须重新发出plot命令,

细胞2:

plot(close_vals.index, close_vals.values)
xlim(datetime(2009,1,1), datetime(2010,1,1))
Run Code Online (Sandbox Code Playgroud)

当我添加移动平均线趋势线和标签时,这很快变得笨重而且不优雅.此外,在IPython控制台上工作,这种逐步构建绘图的方法也可以正常工作.有谁知道在笔记本中创建这种演示的更好方法?谢谢.

更新:

我的最终代码最终看起来像这样.

CELL 1:

from pandas.io.data import DataReader
from datetime import datetime
import matplotlib.pyplot as plt

goog = DataReader("GOOG",  "yahoo", datetime(2000,1,1), datetime(2012,1,1))
close_vals = goog['Close']
fig, ax = subplots(1,1)
ax.plot(close_vals.index, close_vals.values,label='GOOG Stock …
Run Code Online (Sandbox Code Playgroud)

python matplotlib ipython

4
推荐指数
1
解决办法
377
查看次数

"导入"数据是pythonic吗?

我有一个python脚本,在它的"初始化"运行模式中,访问我系统上的多个文件并组装它认为正确的数据.在将脚本设置为在"最终"模式下运行之前,当实际使用数据时,用户需要检查此数据.

现在我正在以python数据结构的形式将要检查的数据写入data.py文件,例如data.py的内容可能是:

data1 = "script_generated_filename_1"

data2 = [ "script_generated_date1",
          "script_generated_date2" ]
Run Code Online (Sandbox Code Playgroud)

用户验证data.py文件后,"最终"运行模式然后使用"导入数据"调用来访问数据,通过data.data1,data.data2等...

我一直在努力清理我的python编程风格,并且更符合通常被认为是pythonic的东西.在阅读了模块文档之后,我怀疑使用这种方式的导入函数是pythonic,还是有更主流的方法来使用python完成这种类型的用户验证.

python import

3
推荐指数
1
解决办法
163
查看次数

使用argparse选项指定类型和模式

我有几个不同的输入文件,用案例编号".1",".2"等保存,以区分它们.我正在构建一个操作这些文件的脚本,我想使用argparse来允许用户指定要操作的特定案例编号,或者使用"_"来指定最后保存的案例(即输入文件与最大的病例数).就像是;

> ls 
   file.1, file.2, file.3
> my_script.py 2
   (operates on file.2)
> my_script.py _
   (operate on file.3)
Run Code Online (Sandbox Code Playgroud)

有没有办法可以指定"任何整数"作为一个选择而"_"作为第二选择?就像是;

parser = argparse.ArgumentParser()
parser.add_argument('case', choices=[anyint, '_'])
Run Code Online (Sandbox Code Playgroud)

python argparse

0
推荐指数
1
解决办法
1795
查看次数