小编Nik*_*her的帖子

python3中具有不同签名的多重继承

我有三个类:A,BC.

C继承自AB(按此顺序).构造函数的签名AB不同.如何调用__init__两个父类的方法?

我在代码中的努力:

class A(object):
    def __init__(self, a, b):
        super(A, self).__init__()
        print('Init {} with arguments {}'.format(self.__class__.__name__, (a, b)))

class B(object):
    def __init__(self, q):
        super(B, self).__init__()
        print('Init {} with arguments {}'.format(self.__class__.__name__, (q)))

class C(A, B):
    def __init__(self):
        super(A, self).__init__(1, 2)
        super(B, self).__init__(3)

c = C()
Run Code Online (Sandbox Code Playgroud)

产生错误:

Traceback (most recent call last):
  File "test.py", line 16, in <module>
    c = C()
  File "test.py", line 13, …
Run Code Online (Sandbox Code Playgroud)

python inheritance multiple-inheritance python-3.x

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

为什么println!仅适用于长度小于33的数组?

在Rust中,这有效:

fn main() {
    let a = [0; 32];
    println!("{:?}", a);
}
Run Code Online (Sandbox Code Playgroud)

但这不是:

fn main() {
    let a = [0; 33];
    println!("{:?}", a);
}
Run Code Online (Sandbox Code Playgroud)

编译错误:

error[E0277]: the trait bound `[{integer}; 33]: std::fmt::Debug` is not satisfied
 --> src/main.rs:3:22
  |
3 |     println!("{:?}", a);
  |                      ^ the trait `std::fmt::Debug` is not implemented for `[{integer}; 33]`
  |
  = note: `[{integer}; 33]` cannot be formatted using `:?`; if it is defined in your crate, add `#[derive(Debug)]` or manually implement it
  = note: required by …
Run Code Online (Sandbox Code Playgroud)

arrays println rust

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

如何在库请求中发送100个继续请求

如何在请求中发送以下HTTP请求?

HTTP/1.1 100 Continue
Run Code Online (Sandbox Code Playgroud)

我想在请求模块中获取负责的套接字并手动完成.像这样的东西:

requests.packages.urllib3.connectionpool.socket.socket.send(b'HTTP/1.1 100 Continue')
Run Code Online (Sandbox Code Playgroud)

但那不干净(也不会起作用).

和想法?

python python-requests

7
推荐指数
0
解决办法
1143
查看次数

与子进程 stdout/stdin 通信

我正在尝试与一个进程通信(该进程本身写入标准输入和标准输出以在终端中与用户交互)并读取它的标准输入并写入它在 C 中的标准输出。

因此我尝试以编程方式替换 shell 用户。一个隐喻的例子:假设我出于某种原因想在 C 中使用 VIM。然后我还需要编写命令(stdout)并从编辑器(stdin)读取内容。

最初我认为这可能是一项微不足道的任务,但似乎没有标准方法。int system(const char *command);只是执行一个命令并将命令 stdin/stdout 设置为调用进程之一。

因为这没有任何结果,所以我查看了FILE *popen(const char *command, const char *type);但手册页指出:

由于管道根据定义是单向的,因此类型参数只能指定读或写,而不是两者;结果流相应地是只读或只写的。

及其含义:

popen() 的返回值在所有方面都是一个普通的标准 I/O 流,除了它必须用 pclose() 而不是 fclose(3) 关闭。 写入这样的流会写入命令的标准输入;命令的标准输出与调用 popen() 的进程的标准输出相同,除非命令本身对此进行了更改。相反,从“popened”流中读取会读取命令的标准输出,并且命令的标准输入与调用 popen() 的进程的标准输入相同

因此,使用 popen() 并不是完全不可能,但在我看来非常不优雅,因为我必须解析调用进程的标准输出(调用 popen() 的代码)才能解析从popened 命令(使用 popen 时输入“w”)。

相反,当使用类型“r”调用 popen 时,我需要写入调用进程的 stdin,以便将数据写入 popened 命令。在这种情况下,我什至不清楚这两个进程是否在标准输入中接收到相同的数据......

我只需要控制程序的标准输入和标准输出。我的意思是不能有这样的功能:

stdin_of_process, stdout_of_process = real_popen("/path/to/bin", "rw")
// write some data to the process stdin
write("hello", stdin_of_process) …
Run Code Online (Sandbox Code Playgroud)

c linux ipc stdout pipe

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

如何在ruby gems中添加(pre/post)_install_hook

我想在安装时使用rubygems.org安装一个带有类似命令的gem来执行一些代码gem install some-gem.

该文档声明您可以使用http://docs.ruby-lang.org/en/2.2.0/Gem.html pre_install挂钩,如下所示:

# File lib/rubygems.rb, line 724
def self.pre_install(&hook)
  @pre_install_hooks << hook
end
Run Code Online (Sandbox Code Playgroud)

该文件进一步指出:

RubyGems默认值存储在rubygems/defaults.rb中.如果您正在打包RubyGems或实现Ruby,您可以更改RubyGems的默认值.对于RubyGems打包器,提供lib/ruby​​gems/defaults/operating_system.rb并覆盖lib/ruby​​gems/defaults.rb中的任何缺省值.对于Ruby实现者,提供lib/ruby​​gems/defaults /#{RUBY_ENGINE} .rb并覆盖lib/ruby​​gems/defaults.rb中的任何缺省值.如果您需要RubyGems 来执行安装或卸载的额外工作,则默认覆盖文件可以设置安装前和安装后的挂钩.请参阅:: pre_install,:: pre_uninstall,:: post_install,:: post_uninstall.

这听起来正是我想要的.所以我创建了文件

  • LIB /的rubygems /默认/ defaults.rb
  • LIB /的rubygems /默认/ operating_system.rb
  • RubyGems的/ defaults.rb

我把代码

Gem.pre_install { puts 'pre install hook called!' }
Run Code Online (Sandbox Code Playgroud)

在所有列出的文件中.然后我将它们添加到gemspec中的require_paths,如下所示:

s.require_paths = ["lib", "test", "rubygems"]
Run Code Online (Sandbox Code Playgroud)

但是在安装gem时终端没有看到输出.

我究竟做错了什么?

ruby gem hook

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

无法在Raspberry Pi上打开共享库(so)

我正在尝试在Raspberry PI ARM机器上运行为Android编译的ARM共享对象二进制文件(在.apk中找到).

不幸的是,二进制文件是封闭源代码,我不能为在Rasberry pi上运行的操作系统重新编译它(raspian,debian derived)

快速提问:是否可以在raspberry pi上运行这样的.so编译?我在这里上传了二进制文件:http://www.speedyshare.com/MSXq9/libfoo.so(很抱歉下载不方便).

我发现这个类似的问题在Linux ARM上为Android运行ARM二进制文件,它表明二进制文件不会在其他unix发行版上运行(我在我的树莓上使用debian,raspian的推导),因为android的c库是Bionic.

可以在debian上安装bionic吗?我怎么能设法运行这个库?

如果我想运行/加载libfoo.so,则在rasbperry机器上生成以下所有输出.

当我尝试在python中加载.so文件时(之前,我相应地设置了LD_PRELOAD)

import ctypes 
import os

path = os.path.dirname(os.path.realpath(__file__))
print ctypes.cdll.LoadLibrary('libfoo.so')
Run Code Online (Sandbox Code Playgroud)

我得到一个OSError:libfoo.so:无法打开共享对象文件:没有这样的文件或目录.

但在查看strace输出之后,似乎加载器无法加载libfoo.so并因此失败并带有轻微的误导性错误消息没有这样的文件或目录(找到所有.so并且加载器尝试加载它,但是失败这样做).

当发出readelf -h libfoo.so时,我得到了

root@raspberrypi:/home/pi# readelf -h libfoo.so 
ELF Header:
  Magic:   7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00 
  Class:                             ELF32
  Data:                              2's complement, little endian
  Version:                           1 (current)
  OS/ABI:                            UNIX - System V
  ABI Version:                       0 …
Run Code Online (Sandbox Code Playgroud)

linux android arm shared-libraries dynamic-linking

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