我正在尝试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) 根据我对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 Horn和claust的有用评论之后,我想将问题重新解释为更广泛的"何时应该在Python中使用方法级联?"
我想知道__attribute__
在使用 MSVC 时处理包含 GCC扩展名的代码的最佳方法是什么。以下是处理此问题的安全方法:
#define __attribute__(x) /* blank - should simply ignore thanks to C preprocessor */
Run Code Online (Sandbox Code Playgroud)
谢谢!
我想知道是否可以使用VideoWriter
Python 中的 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) 为什么在将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 …
我很难理解更改后的回显服务器的行为,该服务器试图利用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
我试图用精确控制在飞行中拍摄的摄像机图像帧的视频编码skvideo.io.FFmpegWriter
和cv2.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 ×4
opencv ×2
python-3.x ×2
attributes ×1
c ×1
c99 ×1
cv2 ×1
cython ×1
embed ×1
f2py ×1
ffmpeg ×1
gcc ×1
in-memory ×1
java ×1
jython ×1
jython-2.7 ×1
methods ×1
python-2.7 ×1
scikits ×1
server ×1
visual-c++ ×1