小编jos*_*inb的帖子

使用asyncio逐行读取文件

我希望在编写时读取几个日志文件并使用asyncio处理它们的输入.代码必须在Windows上运行.根据我从stackoverflow和web搜索的理解,异步文件I/O在大多数操作系统上都很棘手(select例如,不会按预期工作).虽然我确信我可以用其他方法(例如线程)做到这一点,但我会尝试使用asyncio来查看它是什么样的.最有用的答案可能是描述这个问题的解决方案的"架构"应该是什么样的,即应该如何调用或调度不同的函数和协程.

下面给我一个生成器,逐行读取文件(通过轮询,这是可以接受的):

import time

def line_reader(f):
    while True:
        line = f.readline()
        if not line:
            time.sleep(POLL_INTERVAL)
            continue
        process_line(line)
Run Code Online (Sandbox Code Playgroud)

有几个要监视和处理的文件,这种代码需要线程.我稍微修改了它以便更适用于asyncio:

import asyncio

def line_reader(f):
    while True:
        line = f.readline()
        if not line:
            yield from asyncio.sleep(POLL_INTERVAL)
            continue
        process_line(line)
Run Code Online (Sandbox Code Playgroud)

当我通过asyncio事件循环安排它时,这种方法有效,但如果是process_data块,那么这当然不好.在开始时,我想象解决方案看起来像

def process_data():
    ...
    while True:
        ...
        line = yield from line_reader()
        ...
Run Code Online (Sandbox Code Playgroud)

但我无法弄清楚如何使这项工作(至少没有process_data管理相当多的状态).

关于如何构建这种代码的任何想法?

python python-asyncio

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

Gitlab在一个带有apache和乘客的子目录中

我正在尝试设置gitlab,以便可以通过现有的apache服务器的子目录访问它example.com/gitlab,例如.我试图使用乘客,因为这似乎是最容易设置的,但其他解决方案也是可以接受的.遗憾的是,为gitlab使用单独的虚拟主机不是我的选择.

我的设置

在设置时,我遵循了gitlab设置指南乘客文档.

我相信最相关的部分/etc/httpd/conf/httpd.conf如下:

DocumentRoot "/home/.www"

# gitlab config
RackBaseURI /gitlab
<Directory "/home/.www/gitlab">
    Options -MultiViews
</Directory>
Run Code Online (Sandbox Code Playgroud)

DocumentRoot阿帕奇包含一个符号链接到gitlab公共目录:

$ ls -l /home/.www
lrwxrwxrwx  1 root  http    23 Jul 29 12:35 gitlab -> ../gitlab/gitlab/public
Run Code Online (Sandbox Code Playgroud)

使用passenger-install-apache2-module脚本安装了Passenger,脚本输出的配置行包含在apache配置中.

我打同relative_url_rootconfig/gitlab.yml; 这没有任何影响(根据文件中的注释判断,这种机制似乎是不鼓励或弃用的 - 避免它会很好).

结果

访问时example.com/gitlab,我得到以下输出(纯文本文档):

Not Found: /
Run Code Online (Sandbox Code Playgroud)

Apache的日志表明乘客已经启动,但至少favicon.ico是从文档根目录请求,当应该从子目录请求时/gitlab/favicon.ico:

[ 2013-07-29 14:14:12.1029 2037/7f3502e1e740 agents/HelperAgent/Main.cpp:597 ]: PassengerHelperAgent online, listening at unix:/tmp/passenger.1.0.2033/generation-0/request
[ 2013-07-29 14:14:12.1150 2043/7fa24dbf3740 …
Run Code Online (Sandbox Code Playgroud)

apache passenger ruby-on-rails-3 gitlab

13
推荐指数
2
解决办法
7931
查看次数

在新的jupyter笔记本中是不是打破了打印?

我以前在ipython笔记本中使用过漂亮的数学印刷.在升级到jupyter(也升级了许多其他与ipython相关的软件包)之后,漂亮的打印不再像以前一样工作了.我在笔记本的顶部使用此代码进行设置:

import sympy as sp
sp.init_printing()
Run Code Online (Sandbox Code Playgroud)

我也尝试了这个use_latex=Trueuse_latex='mathjax'参数init_printing,但这没有帮助.在所有情况下,表达式在升级后以纯文本格式打印.有关笔记本形式的完整示例,请参阅https://gist.github.com/josteinbf/78dae5085dec0aa19a48#file-sympy_pp-ipynb.

笔记本中和运行jupyter的控制台中都没有错误消息或警告.如何修复(或至少调试)此问题?

python sympy jupyter

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

如何使用sympy简化复杂常量的表达式?

我在sympy中做了一些计算,结果最后是一组常量.其中一个直接插入下面的代码段:

from sympy import *
expr = (18**(Rational(1, 3))/(6*(3 + sqrt(3)*I)**(Rational(1, 3)))
        + 12**(Rational(1, 3))*(3 + sqrt(3)*I)**(Rational(1, 3))/12)
print(expr.evalf())
print(expr.simplify())
Run Code Online (Sandbox Code Playgroud)

这回来了

0.56857902130163 + 0.e-22*I
18**(1/3)/(6*(3 + sqrt(3)*I)**(1/3)) + (36 + 12*sqrt(3)*I)**(1/3)/12
Run Code Online (Sandbox Code Playgroud)

所以表达似乎是一个实数,但同情不能进一步简化它.用笔和纸,我简化了这个

cos(pi/18) / sqrt(3)
Run Code Online (Sandbox Code Playgroud)

它与返回的数值一致evalf().

我已经尝试了许多不同的简化函数,但似乎没有人能够进一步减少表达式.使用类似的替换

expr.subs(3 + sqrt(3)*I, sqrt(12) * exp(I*pi/6))
Run Code Online (Sandbox Code Playgroud)

改善表达,但仍然没有得到结论,它是真实的.使用欧拉的替代公式,

expr.subs(3 + sqrt(3)*I, sqrt(12) * (cos(pi/6) + I*sin(pi/6)))
Run Code Online (Sandbox Code Playgroud)

sympy最终能够得出结论表达式是真实的,但表达本身在打印时会大小爆炸(即使我simplify在替换后尝试).

有没有更好的方法来减少这种情况?我有许多类似的复杂常量表达式,我想知道它们是真实的(或不是).

python math symbolic-math sympy

7
推荐指数
2
解决办法
4761
查看次数

Haskell中Parsec的"电池"

我是Haskell的新手,我一直在尝试使用Parsec作为练习来编写JSON解析器.这大部分进展顺利,我能够用相对较少的代码解析列表和对象,这些代码也是可读的(太棒了!).但是,对于JSON,我还需要解析像这样的原语

  • 整数(可能已签名)
  • 浮动(可能使用科学记数法,如"3.4e-8")
  • 带有例如转义引号的字符串

我希望找到准备使用解析器作为Parsec的一部分.我得到的最接近的是Parsec.Tokens模块(定义integer和朋友),但是这些解析器需要一个"语言定义",这似乎超出了解析像JSON这样简单的东西 - 它似乎是为编程语言.

所以我的问题是:

  1. Parsec.Token中的函数是正确的方法吗?如果是这样,如何制作合适的语言定义?

  2. 整数等"原始"解析器是否定义在其他地方?也许在另一个包裹?

  3. 我自己应该写这些低级解析器吗?我可以看到自己经常重复使用它们......(模糊的科学数据格式等)

我注意到这个网站上的一个问题说Megaparsec包含了这些原语[1],但我想这些不能和parsec一起使用.

相关问题:

如何让Parsec让我调用`read` :: Int?

如何使用parsec解析Integer

parsing haskell parsec

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

如何在zsh中为Azure CLI启用命令完成功能?

我发现有关Azure CLI(az命令)的bash [1]可用命令完成的提示,但是我没有找到有关如何为zsh安装/启用该命令的任何指示。如果可能的话,有人知道该怎么做吗?如果相关,我使用oh-my-zsh。

[1] https://docs.microsoft.com/zh-cn/cli/azure/get-started-with-azure-cli?view=azure-cli-latest#finding-commands

zsh azure zsh-completion azure-cli

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

用keras计算梯度范数权重

我正在尝试计算相对于具有keras的神经网络(作为诊断工具)的权重的梯度范数。最终,我想为此创建一个回调,但是在此过程中,我一直在努力创建一个可以计算梯度并以numpy数组/标量值形式(而不只是tensorflow)形式返回实际值的函数。张量)。代码如下:

import numpy as np
import keras.backend as K
from keras.layers import Dense
from keras.models import Sequential


def get_gradient_norm_func(model):
    grads = K.gradients(model.total_loss, model.trainable_weights)
    summed_squares = [K.sum(K.square(g)) for g in grads]
    norm = K.sqrt(sum(summed_squares))
    func = K.function([model.input], [norm])
    return func


def main():
    x = np.random.random((128,)).reshape((-1, 1))
    y = 2 * x
    model = Sequential(layers=[Dense(2, input_shape=(1,)),
                               Dense(1)])
    model.compile(loss='mse', optimizer='RMSprop')
    get_gradient = get_gradient_norm_func(model)
    history = model.fit(x, y, epochs=1)
    print(get_gradient([x]))

if  __name__ == '__main__':
    main()
Run Code Online (Sandbox Code Playgroud)

调用时代码失败get_gradient()。追溯很长,涉及很多形状,但是关于什么是正确形状的信息很少。我该如何纠正?

理想情况下,我想要一个与后端无关的解决方案,但是基于tensorflow的解决方案也是一种选择。

2017-08-15 15:39:14.914388: W tensorflow/core/framework/op_kernel.cc:1148] Invalid …
Run Code Online (Sandbox Code Playgroud)

python neural-network keras tensorflow

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