如果您对在MacvsWindows上的python中处理rnvsn换行符感兴趣,那么本文将是一篇不错的选择,我们将为您详在本文中,您将会了解到关于在MacvsWindows上的python中处理rnv
如果您对在Mac vs Windows上的python中处理 r n vs n换行符感兴趣,那么本文将是一篇不错的选择,我们将为您详在本文中,您将会了解到关于在Mac vs Windows上的python中处理 r n vs n换行符的详细内容,我们还将为您解答mac的python怎么换行的相关问题,并且为您提供关于64位Windows上的Python 32位内存限制、ue相机与Windows上的python、Windows OS上的Python和Win32之间的IPC、Windows上的python 2.7 vs 2.6速度的有价值信息。
本文目录一览:- 在Mac vs Windows上的python中处理 r n vs n换行符(mac的python怎么换行)
- 64位Windows上的Python 32位内存限制
- ue相机与Windows上的python
- Windows OS上的Python和Win32之间的IPC
- Windows上的python 2.7 vs 2.6速度
在Mac vs Windows上的python中处理 r n vs n换行符(mac的python怎么换行)
我有一个python脚本,当在Windows计算机上运行和在Mac上运行时,该脚本给出了不同的输出。在深入研究时,我发现这是因为Python在Mac上(从文件中)读取换行符时,它读入\r\n
,而在Windows中以某种方式\r
消失了。
因此,如果我\n
将脚本中的每个内容都更改为\r\n
,则在Mac上运行良好。但是,如果我这样做,它将在Windows PC上停止工作。
是否有解决此问题的简便方法?
答案1
小编典典''U''
模式:
Python 2:
我想这可能取决于您从中读取的内容,但是内置的open()函数带有一个’mode’参数,如果您为该模式传递’U’,Python
2将在跨平台方式透明。它要求Python具有通用的换行符支持,但请对其进行测试!
https://docs.python.org/2/library/functions.html#open
Python 3:
在python 3中,该''U''
模式是默认行为,如文档所述:
允许使用其他模式字符
''U''
,该字符不再起作用,被认为已弃用。它以前在文本模式下启用了通用换行符,这成为了Python
3.0中的默认行为。有关更多详细信息,请参考newline参数的文档。
https://docs.python.org/3/library/functions.html#open
64位Windows上的Python 32位内存限制
我遇到了似乎无法理解的内存问题。
我在具有8GB内存的Windows 7 64位计算机上,并运行32位python程序。
程序读取5118个压缩的numpy文件(npz)。Windows报告文件占用磁盘1.98 GB
每个npz文件包含两段数据:“ arr_0”的类型为np.float32,而“ arr_1”的类型为np.uint8
python脚本读取每个文件,将其数据附加到两个列表中,然后关闭该文件。
在文件4284/5118周围,程序引发MemoryException
但是,任务管理器说发生错误时python.exe * 32的内存使用量为1,854,848K〜= 1.8GB。远远小于我的8 GB限制或32位程序的4
GB限制。
在程序中,我捕获到内存错误,并报告:每个列表的长度为4285。第一个列表包含总共1,928,588,480个float32的〜= 229.9
MB数据。第二个列表包含12,342,966,272 uint8的〜= 1,471.3MB数据。
因此,一切似乎都在检查中。除了出现内存错误的那一部分。我绝对有更多的内存,它崩溃的文件约为800KB,因此在读取大文件时不会失败。
此外,文件没有损坏。如果我没有用完所有的内存,我会读得很好。
使事情变得更加混乱的是,所有这些似乎都可以在我的Linux机器上正常工作(尽管它确实具有16GB的内存,而我的Windows机器上却只有8GB),但是似乎并不是该机器的RAM导致此问题。
当我期望Python应该能够分配另外2GB的数据时,为什么会引发内存错误?
答案1
小编典典我不知道您为什么认为您的进程应该能够访问4GB。根据MSDN上Windows发行版的内存限制,在64位Windows 7上,默认的32位进程获得2GB。*这正是它耗尽的地方。
那么,有办法解决吗?
好吧,您可以使用该IMAGE_FILE_LARGE_ADDRESS_AWARE
标志进行自定义的32位Python构建,然后重新构建numpy
以及所有其他扩展模块。我不能保证所有相关的代码都可以通过大地址感知标志真正安全地运行。这是一个好机会,但是除非有人已经做过并对其进行了测试,否则“好机会”是任何人都可能知道的最好的机会。
或者,更明显的是,仅使用64位Python。
物理RAM的数量是完全无关的。您似乎认为您拥有8GB RAM的“ 8GB限制”,但这不是它的工作原理。您的系统将占用所有RAM 以及所需的任何交换空间
,并将其分配给应用程序;一个应用程序即使在8GB的计算机上也可能能够获得20GB的虚拟内存而不会出现内存错误。同时,一个32位应用程序无法访问超过4GB的空间,并且该操作系统将占用部分地址空间(默认情况下为Windows的一半),因此即使在8GB的计算机上,您也只能获得2GB的空间。那没什么其他的。(并不是说在现代操作系统上可能永远“不运行其他任何东西”,但是您知道我的意思。)
那么,为什么这在您的Linux机器上有效呢?
因为您的Linux机器被配置为可以为32位进程提供3.5GB的虚拟地址空间,或3.99GB或………好吧,我无法告诉您确切的数字,但是多年来我见过的每个发行版都已配置至少需要3.25GB。
*还请注意,您甚至没有真正获得全部2GB的数据;您的程序。操作系统及其驱动程序可让您的代码访问的大多数内容都位于另一半,而您加载的每个DLL,所需的任何空间以及各种其他内容则位于另一半。总计不算太多,但不为零。
ue相机与Windows上的python
由于uEye相机是广泛使用的工业相机,我认为有一个标准的解决方案;但是,我找不到任何东西.
该解决方案需要在Windows XP或Windows 7上的python 2.7下运行.
我很感激任何在Windows上成功使用ueye相机的人在这个问题上分享他的知识,或者至少指出我正确的方向.我也觉得确实需要找到一个通用的解决方案,因为我肯定不是唯一有这个要求的人.
到目前为止我尝试过的
(a)pyueye
有一个python driver available在Linux下工作 – 根据文档 – “应该在Windows上工作”.
我试过了,但安装失败了:
python setup.py安装
给我
ueye\ueye.pyx: cannot find cimported module 'stdlib' ueye\ueye.pyx: cannot find cimported module 'python_cobject' Compiling ueye\ueye.pyx because it changed. Compiling ueye\ueyeh.pyx because it changed. [1/2] Cythonizing ueye\ueye.pyx
我不知道cimported模块是什么,以及这是否应该工作.因此,了解是否有人在Windows系统上成功安装此驱动程序可能会很好.
(b)openCV
OpenCV似乎是图像捕获和处理的某种标准.似乎有些人用它来访问uEye相机,而似乎也有一些共识认为uEye相机不适用于openCV.我还没有找到任何据称有效的示例代码.
无论如何我试过这个(使用openCV版本2.4.13),我可以访问相机并从中检索图片.分辨率最初为480 x 640,但我可以将其更改为768 x 1024的传感器分辨率.
但是,我无法正确设置曝光时间和增益,如下面的代码所示.
cam = cv2.VideoCapture(0) width = cam.get(cv2.cv.CV_CAP_PROP_FRAME_WIDTH) height = cam.get(cv2.cv.CV_CAP_PROP_FRAME_HEIGHT) exposure = cam.get(cv2.cv.CV_CAP_PROP_EXPOSURE) print width,height,exposure # prints 640 480 -4.0 hr = cam.set(cv2.cv.CV_CAP_PROP_FRAME_HEIGHT,768) wr = cam.set(cv2.cv.CV_CAP_PROP_FRAME_WIDTH,1024) print "Setting resolution ",hr,wr # prints True True cam.set(cv2.cv.CV_CAP_PROP_EXPOSURE,0) # or any other value,same for gain width = cam.get(cv2.cv.CV_CAP_PROP_FRAME_WIDTH) height = cam.get(cv2.cv.CV_CAP_PROP_FRAME_HEIGHT) exposure = cam.get(cv2.cv.CV_CAP_PROP_EXPOSURE) print width,exposure # 1024.0 768.0 -4.0 ret,buff = cam.read() cam.release()
很可能是相机处于某种自动模式,可以自动调整曝光时间和增益等参数.但如果是这种情况,我该如何设置此自动模式.
(c)simpleCV
simpleCV似乎是openCV的替代品.我也试过了,它给出了只获取480 x 640像素图像的问题,我找不到任何方式来设置它不同,既不是设置曝光时间的方法.
from SimpleCV import Camera cam = Camera(0) img = cam.getimage() # img is a 480 x 640 pixel image
(d)用C编写自己的驱动程序
一种选择可能是编写C代码以通过其SDK访问摄像机.完整的documentation of the SDK可用
似乎有人成功完成了它(here,或here)
但我甚至不知道从哪里开始以及如何将实时图像变成python.
1.使用python ctypes的uEye API:
可以使用ctypes在python中调用uEye API dll中的函数.使用ctypes有点麻烦,因为在python和c之间传递变量需要不断地转换数据类型,但它有效.
import ctypes import numpy as np uEyeDll = ctypes.cdll.LoadLibrary("ueye_api.dll") #include full path or copy dll into same folder as .py script #connect camera cam = ctypes.c_uint32(0) hWnd = ctypes.c_voidp() msg=uEyeDll.is_InitCamera(ctypes.byref(cam),hWnd) ErrChk=uEyeDll.is_EnableAutoExit (cam,ctypes.c_uint(1)) if ~ErrChk: print (' Camera Connected') IS_CM_SENSOR_RAW8 =ctypes.c_int(11) nRet = uEyeDll.is_SetColorMode(cam,IS_CM_SENSOR_RAW8) IS_SET_TRIGGER_SOFTWARE = ctypes.c_uint(0x1000) nRet = uEyeDll.is_SetExternalTrigger(cam,IS_SET_TRIGGER_SOFTWARE) #allocate memory width_py = 1600 height_py = 1200 pixels_py =8 width = ctypes.c_int(width_py) #convert python values into c++ integers height = ctypes.c_int(height_py) bitspixel=ctypes.c_int(pixels_py) pcImgMem = ctypes.c_char_p() #create placeholder for image memory pid=ctypes.c_int() ErrChk=uEyeDll.is_AlLocimageMem(cam,width,bitspixel,ctypes.byref(pcImgMem),ctypes.byref(pid)) if ~ErrChk: print (' Success') else: print (' Memory allocation Failed,no camera with value' +str(cam.value)) # Get image data uEyeDll.is_SetimageMem(cam,pcImgMem,pid) ImageData = np.ones((height_py,width_py),dtype=np.uint8) #put these lines inside a while loop to return continous images to the array "ImageData" uEyeDll.is_FreezeVideo (cam,ctypes.c_int(0x0000)) #IS_DONT_WAIT = 0x0000,or IS_GET_LIVE = 0x8000 uEyeDll.is_copyImageMem (cam,pid,ImageData.ctypes.data)
2.使用pythonnet& uEye .NET界面
从.NET dll调用函数的语法比使用ctypes更简单,但由于某些原因,安装pythonnet(clr)包对我来说很难.以下是使用.NET函数获取摄像机图像的示例:
import numpy as np import clr import sys import System from System import Array,Double,IntPtr,Random print System.Environment.Version from CLR.System.Reflection import Assembly from System.Collections.Generic import Dictionary from System.Runtime.InteropServices import Marshal true =bool(1) false=bool(0) #import .NET dll using clr (pythonnet) sys.path.append(r"C:\Program Files\IDS\uEye\Develop\DotNet") # path of dll clr.AddReference ('uEyeDotNet') # the dll import uEye # initialize camera cam = uEye.Camera() CAM_ID=1; msg=cam.Init(CAM_ID) print 'InitMessage ='+ str(msg) # Change Camera settings gain =1 #% gain exposure = 0.2 #ms ColorMode=cam.PixelFormat.Set(uEye.Defines.ColorMode.SensorRaw8) errChk=cam.Trigger.Set(uEye.Defines.TriggerMode.software) errChk=cam.Gain.Hardware.GetSupported(1,1,1) errChk,gainFactor=cam.Gain.Hardware.ConvertScaledToFactor.Master(gain,1) errChk=cam.Gain.Hardware.Factor.SetMaster(gainFactor) errChk2,gain=cam.Gain.Hardware.Factor.GetMaster(gain) errChk2,gainout=cam.Gain.Hardware.Scaled.GetMaster(1) cam.Timing.Exposure.Set(1) errChk,exposure_out=cam.Timing.Exposure.Get(exposure) #allocate image memory ErrChk,memout=cam.Memory.Allocate(1600,1200,8,true,1) [ErrChk,Width,Height,Bits,Pitch] = cam.Memory.Inquire(memout,1); # image aquisition for n in range(1000): ErrChk=cam.Acquisition.Freeze(true) outarray = System.Array[System.Byte](()) [ErrChk,tmp] = cam.Memory.copyToArray(memout,outarray) #'copy .Net Array using Marshal.copy imageData = np.empty(len(tmp),dtype=np.uint8) Marshal.copy(tmp,IntPtr.__overloads__[int](imageData.__array_interface__['data'][0]),len(tmp))
Windows OS上的Python和Win32之间的IPC
我有两个可以通过Win32 IPC API(CreateFileMapping()等)进行通信的C应用程序
我必须用Python应用程序替换客户端应用程序。
我已经在Python端尝试了以下库。
导入win32file,win32api
但是,此库没有CreateFileMapping()函数。
我也试过了mmap.mmap()函数,但是看不到任何通讯。
import mmap
sharedMemory = mmap.mmap(0,512,"Local\\SharedBuffer")
sharedMemory.write("AB")
我还尝试了“ Global \ SharedBuffer”和“ SharedBuffer”作为共享内存的名称。
#define SHARED_BUFFER_NAME ((LPCSTR)L"Local\\SharedBuffer")
HANDLE bufferHandle = CreateFileMapping(INVALID_HANDLE_VALUE,NULL,PAGE_READWRITE,SHARED_BUFFER_NAME);
// Create a map for accessing Shared Buffer
sharedBuffer = (char*)MapViewOfFile(bufferHandle,FILE_MAP_ALL_ACCESS,SHARED_BUFFER_SIZE);
memset(sharedBuffer,SHARED_BUFFER_SIZE);
while (sharedBuffer[0] == 0);
while (1);
Win32 API对我来说不是必需的。我只需要Windows计算机上C和python应用程序之间的简单共享缓冲区。
谢谢
Windows上的python 2.7 vs 2.6速度
升级包括numpy 1.6.1(从1.6.0),pandas 0.4(从0.3),以及其他可能的东西.
解决方法
关于在Mac vs Windows上的python中处理 r n vs n换行符和mac的python怎么换行的介绍现已完结,谢谢您的耐心阅读,如果想了解更多关于64位Windows上的Python 32位内存限制、ue相机与Windows上的python、Windows OS上的Python和Win32之间的IPC、Windows上的python 2.7 vs 2.6速度的相关知识,请在本站寻找。
本文标签: