小编dln*_*385的帖子

如何在 Python 3 中将文本流编码为字节流?

将字节流解码为文本流很容易:

import io
f = io.TextIOWrapper(io.BytesIO(b'Test\nTest\n'), 'utf-8')
f.readline()
Run Code Online (Sandbox Code Playgroud)

在本例中,io.BytesIO(b'Test\nTest\n')是字节流,f是文本流。

我想做恰恰相反的事情。给定一个文本流或类文件对象,我想将其编码为字节流或类文件对象,而不处理整个流

这是我迄今为止尝试过的:

import io, codecs

f = codecs.getreader('utf-8')(io.StringIO('Test\nTest\n'))
f.readline()
# TypeError: can't concat str to bytes

f = codecs.EncodedFile(io.StringIO('Test\nTest\n'), 'utf-8')
f.readline()
# TypeError: can't concat str to bytes

f = codecs.StreamRecoder(io.StringIO('Test\nTest\n'), None, None,
                         codecs.getreader('utf-8'), codecs.getwriter('utf-8'))
# TypeError: can't concat str to bytes

f = codecs.encode(io.StringIO('Test\nTest\n'), 'utf-8')
# TypeError: utf_8_encode() argument 1 must be str, not _io.StringIO

f = io.TextIOWrapper(io.StringIO('Test\nTest\n'), 'utf-8')
f.readline()
# TypeError: underlying read() …
Run Code Online (Sandbox Code Playgroud)

python io stream character-encoding python-3.x

8
推荐指数
1
解决办法
3064
查看次数

在Python中为切片的元素赋值

这是一个关于Python如何处理数据和变量的简单问题.我已经做了很多实验,并且Python大部分已经弄清楚了,除了这让我一直绊倒:

[编辑:为了清晰起见,我将这些例子分开并重新排列]

例1:

>>> a = [[1], 2]
>>> a[0:1]
[[1]]
>>> a[0:1] = [[5]]
>>> a
[[5], 2] # The assignment worked.
Run Code Online (Sandbox Code Playgroud)

例2:

>>> a = [[1], 2]
>>> a[0:1][0]
[1]
>>> a[0:1][0] = [5]
>>> a
[[1], 2] # No change?
Run Code Online (Sandbox Code Playgroud)

例3:

>>> a = [[1], 2]
>>> a[0:1][0][0]
1
>>> a[0:1][0][0] = 5
>>> a
[[5], 2] # Why now?
Run Code Online (Sandbox Code Playgroud)

谁能向我解释这里发生了什么?

到目前为止,答案似乎声称a[0:1]返回一个新列表,其中包含对第一个元素的引用a.但我不明白这是如何解释实例1的.

python list variable-assignment slice

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

app.doScript和$ .evalFile有什么区别?

到目前为止我发现的唯一区别是:如果运行的脚本app.doScript返回错误,则错误的文件和行号将被app.doScript调用的文件和行号覆盖.

还有其他我应该知道的差异吗?

以下是演示上述差异的示例代码:

首次运行InDesign:

c:
cd "C:\Program Files\Adobe\Adobe InDesign CS6 Server x64"
InDesignServer.com -port 12345
pause
Run Code Online (Sandbox Code Playgroud)

接下来创建一个批处理文件来运行脚本:

c:
cd "C:\Program Files\Adobe\Adobe InDesign CS6 Server x64"
sampleclient -host localhost:12345 -server "C:/doscript_vs_evalfile/call_doScript.jsx"
pause
Run Code Online (Sandbox Code Playgroud)

这是"call_doScript.jsx",它将调用app.doScript.

try {
    app.doScript(new File("/c/doscript_vs_evalfile/called_by_doScript.jsx"));
    "Success";
}
catch (e) {
    var sError = "Encountered " + e.name + " #" + e.number + " at line " + e.line + " of file " + e.fileName + "\n" + e.message;
    app.consoleout(sError);
    sError;
}
Run Code Online (Sandbox Code Playgroud)

这是"called_by_doScript.jsx",由前一个脚本调用:

app.consoleout("Running …
Run Code Online (Sandbox Code Playgroud)

adobe extendscript indesign-server adobe-indesign

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

使用Apache ZooKeeper实现死锁检测

我在一家小型软件公司工作,我的任务是研究分布式锁管理器供我们使用.它必须与Java和C++接口.

我已经使用ZooKeeper工作了几个星期,并根据文档实现了共享锁(读写锁).我现在需要实现死锁检测.如果每个客户端都可以维护锁的图形,那么它将是快速而简单的.但是,您无法可靠地查看ZooKeeper中节点发生的每个更改,因此无法保持准确的图形.这意味着每次检查死锁时,我都需要下载许多锁,这似乎不切实际.

另一种解决方案是在ZooKeeper服务器中实现死锁检测,我现在正在研究它.每个客户端都会在'/ waiting'中创建一个以其会话ID命名的节点,其数据将是其等待的锁.由于每个锁都有一个短暂的所有者,我将有足够的信息来检测死锁.

我遇到的问题是ZooKeeper服务器没有ZooKeeper客户端的同步保证.另外,ZooKeeper服务器没有像客户端那样很好地记录,因为你通常不应该触摸它.

所以我的问题是:如何使用Apache ZooKeeper实现死锁检测?我看到很多人推荐ZooKeeper作为分布式锁管理器,但如果它不能支持死锁检测,那么没有人应该将它用于此目的.


编辑:

我有一个有效的解决方案.我无法保证其正确性,但它已通过我的所有测试.

我正在分享我的checkForDeadlock方法,这是死锁检测算法的核心.以下是您需要了解的其他信息:

  • 一次只能有一个客户端运行死锁检测.
  • 首先,客户端尝试获取资源上的锁.如果资源已被锁定且客户端想要等到它可用,则客户端接下来会检查死锁.如果等待资源不会导致死锁,那么它接下来会在特殊目录中创建一个znode,该目录标识此客户端正在等待该资源.那条线看起来像这样:waitNode = zooKeeper.create(waitingPath + "/" + sessionID, resource.getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL);
  • 在此客户端创建等待节点之前,没有其他客户端应该开始检查死锁.
  • 如果两个客户端几乎同时尝试获取锁,但是同时授予这两个锁会导致死锁,那么稍有可能的是,第一个客户端可能会被拒绝,而不是第一个客户端获得锁定而第二个客户端被拒绝.第二个客户端可以获得锁定.这应该不是问题.
  • checkForDeadlockDeadlockException如果发现死锁,则抛出一个.否则,它会正常返回.
  • 锁严格按顺序授予.如果资源具有授予的读锁定和等待写入锁定,并且另一个客户端想要获取读取锁定,则必须等到授予写入锁定然后释放之后.
  • bySequenceNumber 是一个比较器,按照ZooKeeper附加到顺序znode末尾的序列对znodes进行排序.

码:

private void checkForDeadlock(String pathToResource) throws DeadlockException {
    // Algorithm:
    //   For each client who holds a lock on this resource:
    //     If this client is me, announce deadlock.
    //     Otherwise, if this client is waiting for a reserved resource, recursively check for deadlock …
Run Code Online (Sandbox Code Playgroud)

java distributed deadlock locking apache-zookeeper

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

如何在PyCharm中自动生成Python API文档

我在PyCharm中有一个Python项目,我想从我的Python代码和文档字符串中自动生成API文档(以HTML的形式).

根据此页面,有许多工具可以生成Python API文档:

  • 自动摘要
  • 车博士
  • PDOC
  • 是pydoc
  • pydoctor
  • Doxygen的

该页面还注意到以下工具"流程文档":

  • docutils的
  • 狮身人面像

PyCharm文件说的是docutils的狮身人面像和可以使用"产生格式化的API文档".但是,这似乎是不正确的,因为它们的配置表明这些工具只处理*.rst文件,而不处理*.py文件.

我的问题是:我可以使用PyCharm的DocUtils或Sphinx功能来生成API文档吗?

如果做不到这一点,我可以使用PyCharm的任何功能来做到这一点吗?

如果不这样做,有没有任何工具可以与PyCharm很好地集成?

python documentation pycharm docutils python-sphinx

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

如何设置 Python CGI 服务器?

我在 Windows 上运行 Python 3.2。我想在我的机器上运行一个简单的 CGI 服务器以进行测试。这是我到目前为止所做的:

我使用以下代码创建了一个 python 程序:

import http.server
import socketserver
PORT = 8000
Handler = http.server.CGIHTTPRequestHandler
httpd = socketserver.TCPServer(("", PORT), Handler)
httpd.serve_forever()
Run Code Online (Sandbox Code Playgroud)

在同一文件夹中,我创建了“index.html”,一个简单的 HTML 文件。然后我运行该程序并在网络浏览器中访问http://localhost:8000/,页面成功显示。接下来,我在同一目录中创建了一个名为“hello.py”的文件,代码如下:

import cgi
import cgitb
cgitb.enable()
print("Content-Type: text/html;charset=utf-8")
print()
print("""<html><body><p>Hello World!</p></body></html>""")
Run Code Online (Sandbox Code Playgroud)

现在,如果我访问http://localhost:8000/hello.py,我的网络浏览器会显示上面的完整代码,而不仅仅是“Hello World!”。如何让 python 在提供 CGI 代码之前执行它?

html python windows cgi http

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

在Python中对字符串前缀执行二进制搜索

我想搜索以给定子字符串开头的所有元素的排序字符串列表.

这是一个查找所有完全匹配的示例:

import bisect
names = ['adam', 'bob', 'bob', 'bob', 'bobby', 'bobert', 'chris']
names.sort()
leftIndex = bisect.bisect_left(names, 'bob')
rightIndex = bisect.bisect_right(names, 'bob')
print(names[leftIndex:rightIndex])
Run Code Online (Sandbox Code Playgroud)

哪个打印['bob', 'bob', 'bob'].

相反,我想搜索所有以'bob' 开头的名字.我想要的输出是['bob', 'bob', 'bob', 'bobby', 'bobert'].如果我可以修改bisect搜索的比较方法,那么我可以用name.startswith('bob')它来做.

举个例子,在Java中它很容易.我会用:

Arrays.binarySearch(names, "bob", myCustomComparator);
Run Code Online (Sandbox Code Playgroud)

其中'myCustomComparator'是一个利用startswith方法(和一些额外的逻辑)的比较器.

我如何在Python中执行此操作?

python arrays search

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

如何在Java中找到分数的下限和余数?

给定整数 'a' 和 'b',我想要一个返回 a / b 的下限和余数的方法,这样:

  • a / b = 下限 + 余数 / |b| (其中 |b| 是 b 的绝对值),并且
  • 0 <= 余数 < |b|。

例如,5/3 = 1 + 2/3。

a这是仅适用于 正和的尝试b

public static long[] floorAndRemainder(long a, long b) {
  long floor = a / b;
  long remainder = a % b;
  return new long[] { floor, remainder };
}
Run Code Online (Sandbox Code Playgroud)

我需要一个适用于所有正负分子和分母的函数。例如,

  • -5/3 = -2 + 1/3
  • 5/-3 = -2 + 1/3
  • -5/-3 = 1 + …

java math methods function

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

如何使用JSDoc记录函数

JSDoc似乎没有接受我的大部分功能.这是一个例子:

/**
 * Function one.
 */
(function one() {
    /**
     * Function two.
     */
    function two() {
        /**
         * Function three.
         */
        function three() {
        }
    }
})();

var four = {
    /**
     * Function five/six.
     */
    five: function six() {
    },
    /**
     * Function seven/eight.
     */
    seven: function eight() {
    },
};

nine.ten = {
    /**
     * Function eleven/twelve.
     */
    eleven: function twelve() {
        /**
         * Function thirteen/fourteen.
         */
        var thirteen = function fourteen() {
        };
    },
    /**
     * …
Run Code Online (Sandbox Code Playgroud)

javascript documentation standards documentation-generation jsdoc

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