小编jez*_*jez的帖子

如果在Python中没有数据传输,如何从stdin或文件中读取?

我有一个CLI脚本,希望它从文件中读取数据.它应该能够以两种方式阅读:

  • cat data.txt | ./my_script.py
  • ./my_script.py data.txt

- 有点像grep,例如.

我知道的:

  • sys.argvoptparse让我轻松地阅读任何指定参数和选项.
  • sys.stdin 让我读一下管道传输的数据
  • fileinput 使整个过程自动化

不幸:

  • 使用fileinputstdin和任何args作为输入.所以我不能使用非文件名的选项,因为它试图打开它们.
  • sys.stdin.readlines() 工作正常,但如果我不管道任何数据,它会挂起,直到我进入 Ctrl + D
  • 我不知道如何实现"如果没有在stdin中,从args中的文件读取"因为stdin总是True在布尔上下文中.

如果可能的话,我想以便携的方式做到这一点.

python stdin pipe command-line-interface

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

在GLSL中将浮点数转换为十进制数?

正如其他人所讨论的那样,GLSL缺乏任何类型的printf调试.但有时我真的想在调试着色器时检查数值.

我一直在尝试创建一个可视化调试工具.我发现如果使用sampler2D其中数字0123456789已经在等宽度中渲染的数据,可以在着色器中相当容易地渲染任意数字系列.基本上,你只是玩弄你的x坐标.

现在,要使用它来检查浮点数,我需要一个算法将a转换float 为十进制数字序列,例如您可能在任何printf实现中找到.不幸的是,据我所知这个主题,这些算法似乎需要以更高精度的格式重新表示浮点数,我不知道这似乎有可能在GLSL中我似乎有只有32位float可用.出于这个原因,我认为这个问题不是任何一般的"printf如何工作"问题的重复,而是具体关于如何使这些算法在GLSL的约束下工作.我已经看到了这个问题和答案,但不知道那里发生了什么.

我尝试过的算法并不是很好.我的第一次尝试,标记为版本A(注释掉)似乎非常糟糕:采取三个随机的例子,RenderDecimal(1.0)渲染为1.099999702,RenderDecimal(2.5)给了我, 2.599999246然后RenderDecimal(2.6)出来了2.699999280.我的第二次尝试,标志着版本B,似乎略胜一筹:1.02.6两者出来罚款,但RenderDecimal(2.5)仍然不匹配的一个明显的凑整5的事实,剩余的是0.099....结果显示为2.599000022.

我的最小/完整/可验证的例子,下面,从一些简短的GLSL 1.20代码开始,然后我碰巧选择了Python 2.x,只是为了编译着色器并加载和渲染纹理.它需要pygame,numpy,PyOpenGL和PIL第三方软件包.请注意,Python实际上只是样板,并且可以通过C或其他任何东西重写(尽管繁琐).只有顶部的GLSL代码对于这个问题至关重要,因此我不认为这些pythonpython 2.x标签会有所帮助.

它需要将以下图像保存为digits.png:

0123456789

vertexShaderSource = """\

varying vec2 vFragCoordinate;
void main(void)
{
    vFragCoordinate = gl_Vertex.xy;
    gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
}

"""
fragmentShaderSource = """\

varying vec2      vFragCoordinate;

uniform …
Run Code Online (Sandbox Code Playgroud)

opengl algorithm printf glsl

11
推荐指数
1
解决办法
2478
查看次数

如何从Python中的exec或execfile获取错误的行号

假设我有以下多行字符串:

cmd = """
    a = 1 + 1
    b = [
       2 + 2,
       4 + 4,
    ]
    bork bork bork
"""
Run Code Online (Sandbox Code Playgroud)

我想在特定范围内执行它:

scope = {}
exec( cmd, scope )
print scope[ 'b' ]
Run Code Online (Sandbox Code Playgroud)

有一个SyntaxError在命令的第6行,我希望能够向大家报告,给用户.我如何获得行号?我试过这个:

try:
    exec( cmd, scope )  # <-- let's say this is on line 123 of the source file
except Exception, err:
    a, b, c = sys.exc_info()
    line_number = c.tb_lineno  # <-- this gets me 123,  not 6
    print "%s at line %d …
Run Code Online (Sandbox Code Playgroud)

python python-2.7

10
推荐指数
1
解决办法
4321
查看次数

使用多处理/线程将numpy数组操作分解为块

我有一个定义的函数,它呈现一个MxN数组.该阵列非常庞大,因此我想使用该函数同时使用多处理/线程生成小型阵列(M1xN,M2xN,M3xN --- MixN.M1 + M2 + M3 + --- + Mi = M)并最终加入这些数组形成mxn数组.正如Boardrider先生正确地建议提供一个可行的例子,下面的例子将广泛传达我打算做的事情

import numpy as n
def mult(y,x):
    r = n.empty([len(y),len(x)])
    for i in range(len(r)):
        r[i] = y[i]*x
    return r
x = n.random.rand(10000)
y = n.arange(0,100000,1)
test = mult(y=y,x=x)
Run Code Online (Sandbox Code Playgroud)

随着系统的长度xy增加将需要越来越多的时间.对于这个例子,我想运行此代码,这样如果我有4个核心,我可以给工作,每个季度,即放弃工作来计算元素r[0],以r[24999]向第一核心,r[25000]r[49999]到第二核心,r[50000]r[74999]对第三个核心,r[75000]r[99999]到第4核心.最终将结果添加到一起,将它们附加到一个阵列r[0]r[99999].

我希望这个例子能说清楚.如果我的问题仍然不明确,请告诉我.

python arrays multithreading multiprocessing

10
推荐指数
1
解决办法
1490
查看次数

哪些python类允许分配尚未存在的属性,哪些不支持?

在Python中,__dict__实例似乎对某些类是"开放的",对其他类"封闭":

# "closed" type example:
x = object()
x.eggs = 'spam'   # raises an AttributeError
Run Code Online (Sandbox Code Playgroud)

然而:

# "open" type example I:
x = Exception()
x.eggs = 'spam'   # does not raise an AttributeError

# "open" type example II: subclasses
class thing(object): pass
x = thing()
x.eggs = 'spam'   # does not raise an AttributeError
Run Code Online (Sandbox Code Playgroud)

我想了解这种行为差异的实施地点/方式/原因:为什么object关闭但是thing开放?为什么Exception开放?这个问题有两个原因:

  • 在纯Python中,我发现复制"封闭"行为的唯一方法是实现__setattr__自己并AttributeError在其中引发,手动编写适当格式的错误消息.是否有一种不那么冗长,更干的方式(以及一种不会产生潜在误导性回溯的方式__setattr__)?

  • 在我编写的IPC模块中,我想记录一个使用示例,最简洁和最通用的方法是找到一个内置的例子type(失败,一个来自标准库)(a)可以腌制并发送到另一个进程,(b)其实例表现出"开放"行为.到目前为止,我发现的最好的是Exception但在文档中看起来有点误导(人们会认为它是关于异常的).更通用的对象会更好,但是object关闭,除非将其定义保存在路径上的文件中,否则子类(thing如上例中所示)是不可能pickle …

python

9
推荐指数
0
解决办法
83
查看次数

提出似乎来自调用者的异常

我有与此处提出的问题相同的问题,但错误地将其视为另一个相关问题的副本:

Python库如何以这样的方式引发异常,使其自己的代码不会在回溯中暴露?动机是要清楚地表明库函数被错误地调用:调用者中的违规行似乎应该承担责任,而不是库内(故意地,正确地)引发异常的行.

正如在封闭的问题,伊恩的评论指出,这是 一样的,询问如何可以调整代码在调用改变出现一个回溯的方式.

我失败的尝试在下面.在标记的行上QUESTION,我尝试修改了属性 tb,例如tb.tb_frame = tb.tb_frame.f_back但是这导致了 AttributeError: readonly attribute.我还尝试创建一个具有相同属性的duck-typed对象,tb但是在这期间失败 reraise()TypeError: __traceback__ must be a traceback or None.(我试图通过子类化智胜这traceback是会见了TypeError: type 'traceback' is not an acceptable base type).

traceback在任何情况下,调整对象本身可能是这个X的错误Y - 也许还有其他策略?

我们假设Alice编写了以下库:

import sys

# home-made six-esque Python {2,3}-compatible reraise() definition
def reraise( cls, instance, tb=None ): # Python 3 definition
    raise ( cls() if instance is None …
Run Code Online (Sandbox Code Playgroud)

python exception-handling exception

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

在Anaconda修复matplotlib/numpy依赖地狱

我在MacBook上运行Anaconda 2.0.0(x86_64)下的Python 2.7.11.

几周前,作为让OpenCV工作的过程的一部分,我numpy从任何地方(不幸/愚蠢地没有记录)降级到1.7.1.我似乎记得这是必要的,我不希望OpenCV停止工作,所以我很确定我现在应该离开numpy它.

但是,今天我发现这已经打破了我matplotlib/ pylab.当我这样做时,import pylab我得到以下内容:

---------------------------------------------------------------------------
RuntimeError                              Traceback (most recent call last)
RuntimeError: module compiled against API version 9 but this version of numpy is 7
---------------------------------------------------------------------------
ImportError                               Traceback (most recent call last)    
...
...
ImportError: numpy.core.multiarray failed to import
Run Code Online (Sandbox Code Playgroud)

因此,我的问题是:如何安装(或回滚)matplotlib与现有版本兼容的版本numpy,而不会打扰我现有的版本numpy

这是我到目前为止所处的位置:基于condaSO的相关问题,我查看其输出conda list --revisions matplotlib包括:

...
2016-03-28 17:16:36  (rev 6)
     conda  {3.8.3 -> 4.0.5}
     conda-env  {2.0.1 -> …
Run Code Online (Sandbox Code Playgroud)

numpy matplotlib python-2.7 anaconda conda

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

passing quoted arguments from batch file to `powershell start` - self-elevation on demand

I am writing a Windows batch file that automatically escalates itself to administrative permissions, provided the user clicks "Yes" on the User Access Control dialog that appears.

I am using a technique I learned here to detect whether we already have admin rights and another from here to escalate. When appropriate, the following script, let's call it foo.bat, re-launches itself via a powershell-mediated call to runas:

@echo off
net session >NUL 2>NUL
if %ERRORLEVEL% NEQ 0 (
powershell …
Run Code Online (Sandbox Code Playgroud)

quotes powershell escaping batch-file elevated-privileges

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

可以基于每个会话以编程方式启用/禁用DPI扩展吗?

我的应用程序碰巧是使用pygame用Python编写的,它包含了SDL,但我想这可能是一个与Windows API有关的更普遍的问题.

在我的一些Python应用程序中,即使在高分辨率下,我也希望在Windows 10下进行像素对像素控制.我希望能够确保,例如,如果我的Surface Pro 3具有2160x1440的原始分辨率,那么我可以进入具有这些尺寸的全屏模式并呈现完全那些尺寸的全屏图像.

对此的障碍是"DPI缩放".默认情况下,在Windows的"设置" - >"显示"下,"更改文本,应用和其他项目的大小"的值为"150%(推荐)",结果是我只看到了图像的2/3.我发现了如何修复这种行为......

  1. 系统范围内,通过将该滑块向下移动到100%(但对于大多数其他应用程序而言这是不合需要的)
  2. 只为python.exepythonw.exe,通过将这些可执行文件的'属性’对话框,兼容性选项卡,单击'高DPI设置禁用显示缩放’.我可以单独为我或所有用户这样做.我还可以通过以编程方式在注册表中设置适当的密钥来自动执行此过程.或者通过.exe.manifest文件(也似乎需要更改全局设置,更喜欢外部清单,可能对其他应用程序产生副作用).

我的问题是:我能做到这一点从内部对每个发射基础课程的话,之前我开我的图形窗口?我或任何使用我的软件的人都不一定要为所有 Python应用程序启用此设置- 我们可能只需要在运行特定的Python程序时使用它.我想象可能会有一个winapi调用(或者在SDL内部失败的东西,由pygame包装)可以实现这一目标,但到目前为止,我的研究正在填补空白.

graphics winapi windows-10

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

清除“双端队列”:它是线程安全的吗?

collections.deque 我一直在此处此处阅读有关 CPython 的线程安全性的内容。我知道.append().popleft()操作在线程之间可以很好地配合,就像.appendleft()和一样.pop()

.popleft()我的问题是:和之间同样适用吗.clear()?或者如果失败的话,在.popleft()和之间.pop()?我的情况是,我有一个消费者线程,称之为 A,不断地.popleft()从 a 获取项目deque d,还有一个生产者线程 B,将.append()它们放在右侧。在某些时候,我希望线程 B 能够说“取消所有待处理项目”。如果我这样做

d.clear()
Run Code Online (Sandbox Code Playgroud)

由于与线程 A 的操作冲突,它是否可能导致未定义的行为.popleft()?如果我说:

while d:
    try: d.pop()
    except: break
Run Code Online (Sandbox Code Playgroud)

反而?

python multithreading deque python-2.7 python-3.x

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