小编Lia*_*con的帖子

使用f2py编译模块复杂的Cython嵌入式可执行文件

我正在尝试cython化一个python项目,该项目位于https://pypi.python.org/packages/source/p/phaseshifts/phaseshifts-0.1.2-dev.zip,其最终目标是为phsh创建一个独立的可执行文件. py模块.我希望嵌入的项目的核心结构具有以下层次结构:

phaseshifts/
    __init__.py
    atorb.py
    conphas.py
    elements.py
    leed.py
    phsh.py
    lib/
        __init__.py
        libphsh.pyd`
Run Code Online (Sandbox Code Playgroud)

注意:libphsh.pyd模块使用编译f2py.

我想我的问题实际上分为多个部分:

1)如何使用cython创建包含多个.py[x]?文件的独立可执行文件?(比如使用--embed单个模块的选项来嵌入python解释器时)
2)如果1)是可能的,那么可以编译.pyd.so包含文件,如果是,如何?

非常感谢SO退伍军人的任何帮助:-)

编辑

到目前为止,粗略的解决方法是编译libphsh.f成dll,gfortran -shared -o libphsh.dll libphsh.f然后编辑相关的源文件以使用ctypes加载库.接下来,我使用cython *.py创建每个Python模块我希望,除了phsh.py,其中I使用的C源文件cython --embed phsh.py.

最后,我使用GCC编译源代码并链接到python库,例如

gcc -o phsh.exe phsh.c __init__.c atorb.c conphas.c elements.c leed.c model.c \
-I"C:\Python27\include" -L"C:\Python27\libs" -lpython27
Run Code Online (Sandbox Code Playgroud)

但是,在运行已编译的可执行文件时,应用程序终止显示消息:

This application has requested the Runtime to terminate it in …
Run Code Online (Sandbox Code Playgroud)

python embed cython f2py

8
推荐指数
0
解决办法
790
查看次数

何时在Python中使用方法级联?

根据我对Pythonic编码风格(特别是PEP20)的理解,代码必须简单易读.考虑到这一点,方法层叠被认为是Pythonic?

例如,假设我们有一个Cascade类:

class Cascade(object):
  def __init__(self, pythonic):
    self.question = 'Is this Pythonic?'
    self.answer = pythonic

  def copy(self):
    import copy
    return copy.deepcopy(self)

  def is_pythonic(self):
    return self.answer
Run Code Online (Sandbox Code Playgroud)

然后哪个更好:

>>> cas = Cascade(False)
>>> cas.copy().is_pythonic()
 False
Run Code Online (Sandbox Code Playgroud)

要不然:

>>> cas1 = Cascade(False)
>>> cas2 = cas1.copy()
>>> cas2.is_pythonic()
 False
Run Code Online (Sandbox Code Playgroud)

在我看来,第一个选项更具可读性,因为我的眼睛从左到右扫 - 几乎类似于读书,而第二个选项每行保留一个简单的声明(这无疑是高度可读的).

编辑

Haleemur Ali,Lutz Hornclaust的有用评论之后,我想将问题重新解释为更广泛的"何时应该在Python中使用方法级联?"

python methods python-2.7 python-3.x

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

在 MSVC 中处理 __attribute__

我想知道__attribute__在使用 MSVC 时处理包含 GCC扩展名的代码的最佳方法是什么。以下是处理此问题的安全方法:

#define __attribute__(x) /* blank - should simply ignore thanks to C preprocessor */
Run Code Online (Sandbox Code Playgroud)

谢谢!

c attributes gcc c99 visual-c++

5
推荐指数
2
解决办法
3909
查看次数

使用 OpenCV VideoWriter 和 Python BytesIO 在内存中流式传输视频

我想知道是否可以使用VideoWriterPython 中的 OpenCV类“流式传输”数据?

通常为了处理内存中的数据,否则我会使用 BytesIO(或 StringIO)。

我尝试使用 BytesIO 失败了:

import cv2
from io import BytesIO

stream = cv2.VideoCapture(0)
fourcc = cv2.VideoWriter_fourcc('x264')

data = BytesIO()

# added these to try to make data appear more like a string
data.name = 'stream.{}'.format('av1')
data.__str__ = lambda x: x.name

try:
    video = cv2.VideoWriter(data, fourcc=fourcc, fps=30., frameSize=(640, 480))
    start = data.tell()

        # Check if camera opened successfully
        if (stream.isOpened() == False): 
            print("Unable to read camera feed", file=sys.stderr)
            exit(1)

        # record loop
        while True: …
Run Code Online (Sandbox Code Playgroud)

python opencv in-memory video-streaming cv2

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

比较Java和Jython类型时的奇怪行为

为什么在将Java整数与Jython中具有相同值的Python整数进行比较时,我会遇到以下行为?

>>> from java.lang import Integer
>>> 10 == Integer(10)
False
>>> 10 <= Integer(10)
True
>>> 10 >= Integer(10)
True
Run Code Online (Sandbox Code Playgroud)

好的,所以我发现两者<=>=运算符都按预期进行评估很奇怪,但却==没有...所以现在让我们检查Java和Jython类型之间的隐式转换:

>>> i = Integer(10)
>>> i == 10
False
Run Code Online (Sandbox Code Playgroud)

我听到你说的其他Java类怎么样?我们试试吧:

>>> from java.lang import Boolean
>>> Boolean(0) == False
False
>>> Boolean(0) == True
False
>>> Boolean(0)  # lets just check it is a Java false not a Python one
false
Run Code Online (Sandbox Code Playgroud)

我是否遗漏了某些东西,或者就像__eq__Java类(我使用的是Jython 2.7)中的魔术(dunder)方法一样简单?

编辑

感谢weston澄清在java中10 == new …

java jython primitive-types comparison-operators jython-2.7

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

具有多个客户端和无限循环的Python asyncio协议行为

我很难理解更改后的回显服务器的行为,该服务器试图利用python 3的asyncio模块。

本质上,我有一个无限循环(可以说,在建立连接后,我想无限地将一些数据从服务器流式传输到客户端),例如MyServer.py

#! /usr/bin/python3
import asyncio
import os
import time

class MyProtocol(asyncio.Protocol):

    def connection_made(self, transport):
        peername = transport.get_extra_info('peername')
        print('Connection from {}'.format(peername))
        self.transport = transport

    def connection_lost(self, exc):
        asyncio.get_event_loop().stop()

    def data_received(self, data):
        i = 0
        while True:
            self.transport.write(b'>> %i' %i)
            time.sleep(2)
            i+=1

loop = asyncio.get_event_loop()
coro = loop.create_server(MyProtocol, 
    os.environ.get('MY_SERVICE_ADDRESS', 'localhost'), 
    os.environ.get('MY_SERVICE_PORT', 8100))
server = loop.run_until_complete(coro)

try:
    loop.run_forever()
except:
    loop.run_until_complete(server.wait_closed())
finally:
    loop.close()
Run Code Online (Sandbox Code Playgroud)

接下来,当我连接nc ::1 8100并发送一些文本(例如“测试”)时,我得到以下信息:

user@machine$ nc ::1 8100
*** Connection from('::1', 58503, 0, 0) …
Run Code Online (Sandbox Code Playgroud)

client-server python-3.x python-asyncio microservices server

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

使用skvideo.io.FFmpegWriter从相机写入帧

我试图用精确控制在飞行中拍摄的摄像机图像帧的视频编码skvideo.io.FFmpegWritercv2.VideoCapture,如

from skvideo import io
import cv2

fps = 60
stream = cv2.VideoCapture(0)                    # 0 is for /dev/video0
print("fps: {}".format(stream.set(cv2.CAP_PROP_FPS, fps)))

stream.set(cv2.CAP_PROP_FRAME_WIDTH, 1920)
stream.set(cv2.CAP_PROP_FRAME_HEIGHT, 1080)
print("bit_depth: {}".format(stream.set(cv2.CAP_PROP_FORMAT, cv2.CV_8U)))

video = io.FFmpegWriter('/tmp/test_ffmpeg.avi', 
            inputdict={'-r': fps, '-width': 1920, '-height': 1080},
            outputdict={'-r': fps, '-vcodec': 'libx264', '-pix_fmt': 'h264'}
)

try:
    for i in range(fps*10):  # 10s of video
        ret, frame = stream.read()
        video.writeFrame(frame)
finally:
    stream.release()

try:
    video.close()
except:
    pass
Run Code Online (Sandbox Code Playgroud)

但是,我收到以下异常(在Jupyter笔记本中):

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)

<ipython-input-33-007a547c4229> in <module>()
     18 …
Run Code Online (Sandbox Code Playgroud)

python opencv ffmpeg video-capture scikits

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