我正在使用Python的ctypes库与Windows DLL进行通信.当我从IDLE,Ipython运行我的代码,或者输入交互式python解释器时,它工作正常.当我从Windows命令提示符运行相同的代码时,它崩溃了.为什么单向崩溃,一种方式成功?
这是我正在运行的代码的简化版本:
import ctypes, os, sys
print "Current directory:", os.getcwd()
print "sys.path:"
for i in sys.path:
print i
PCO_api = ctypes.oledll.LoadLibrary("SC2_Cam")
camera_handle = ctypes.c_ulong()
print "Opening camera..."
PCO_api.PCO_OpenCamera(ctypes.byref(camera_handle), 0)
print " Camera handle:", camera_handle.value
wSensor = ctypes.c_uint16(0)
print "Setting sensor format..."
PCO_api.PCO_SetSensorFormat(camera_handle, wSensor)
PCO_api.PCO_GetSensorFormat(camera_handle, ctypes.byref(wSensor))
mode_names = {0: "standard", 1:"extended"}
print " Sensor format is", mode_names[wSensor.value]
Run Code Online (Sandbox Code Playgroud)
当我从IDLE或Ipython运行此代码时,我得到以下结果:
Current directory: C:\Users\Admin\Desktop\code
sys.path:
C:\Users\Admin\Desktop\code
C:\Python27\Lib\idlelib
C:\Windows\system32\python27.zip
C:\Python27\DLLs
C:\Python27\lib
C:\Python27\lib\plat-win
C:\Python27\lib\lib-tk
C:\Python27
C:\Python27\lib\site-packages
Opening camera...
Camera handle: 39354336
Setting sensor format... …Run Code Online (Sandbox Code Playgroud) 我想用python的多处理模块在不同的子进程之间共享几个numpy数组.我希望这些数组可以单独锁定,我希望在运行时动态确定数组的数量.这可能吗?
在这个答案中,JF Sebastian提出了一种在多处理过程中在共享内存中使用python的numpy数组的好方法.该数组是可锁定的,这就是我想要的.我想做一些非常相似的事情,除了可变数量的共享数组.数组的数量将在运行时确定.他的示例代码非常清晰,几乎完全符合我的要求,但我不清楚如何声明可变数量的此类数组,而不给每个数组一个硬编码的名称,如shared_arr_1,shared_arr_2等等.这样做的正确方法是什么?
我使用 Tkinter 在 python 中编写了一个简单的 GUI 程序。我们将此程序称为“gui.py”。我的用户使用Portable Python从 USB 密钥在 Windows 计算机上运行“gui.py” ;在主机上安装任何东西都是不可取的。
我希望我的用户通过双击 USB 密钥根目录下的图标来运行“gui.py”。我的用户不关心 python 是什么,如果不需要,他们也不想使用命令提示符。我不希望他们关心 USB 密钥分配的驱动器号。我希望它可以在 XP、Vista 和 7 上运行。
我的第一个丑陋的解决方案是在 USB 密钥的根目录中创建一个快捷方式,并将快捷方式的“目标”属性设置为“(root)\App\pythonw.exe (root)\App\gui.py” ”,但我不知道如何在 Windows 快捷方式中执行相对路径,并且使用像“E:”这样的绝对路径似乎很脆弱。
我的下一个解决方案是在 USB 闪存盘的根目录中创建一个 .bat 脚本,如下所示:
@echo off
set basepath=%~dp0
"%basepath%App\pythonw.exe" "%basepath%\App\gui.py"
Run Code Online (Sandbox Code Playgroud)
这似乎并不关心 USB 密钥分配的驱动器号,但它确实在我的程序运行时使 DOS 窗口保持打开状态。实用,但丑陋。
接下来我尝试了这样的 .bat 脚本:
@echo off
set basepath=%~dp0
start "" "%basepath%App\pythonw.exe" "%basepath%\App\gui.py"
Run Code Online (Sandbox Code Playgroud)
(有关有趣引用的解释,请参见此处)
现在,在 GUI 打开之前,DOS 窗口会在屏幕上短暂闪烁。少一点丑!还是丑啊
真正的男人如何处理这个问题呢?从 USB 记忆棒在 Windows 机器上启动 python Tkinter GUI 的最不丑陋的方法是什么?
编辑:下面的所有答案都非常好(py2exe、pyinstaller、小.exe、.wsf 脚本。).wsf 解决方案是最简单的,所以我现在使用它。如果我想要更漂亮的图标和标准的 .exe 扩展名,我可能最终会切换到其他三种解决方案之一。感谢大家!
如果我使用 Python 的交互模式一次输入一个命令,我有一些 Python 代码可以按预期工作。myscript.py如果保存为并运行为 ,相同的代码会崩溃'C:\Python27\python.exe myscript.py'。
如果相同的代码在交互模式下工作,作为脚本运行 Python 代码会在哪些方面导致其崩溃?
这个问题询问如何判断 python 是否处于交互模式。然而,提问者只想要一个单一的、可靠的交互模式指纹。我想要一个交互模式不同的方式的列表,特别注意这可能导致的问题。
例如:
Python 的交互模式和脚本模式之间还有什么不同?
我的python应用程序启动一个创建pyglet窗口的子进程.当pyglet窗口打开时,它位于所有其他窗口的前面,并且需要键盘焦点.我希望我的pyglet窗口在后台打开,而不是焦点.这可能吗?
我正在使用的代码的简化版本:
import pyglet
pyglet.window.Window()
pyglet.app.run()
Run Code Online (Sandbox Code Playgroud)
我正在使用Windows 7,以防万一.
我经常使用python对象的方法阻塞直到完成,并希望将这些方法转换为非阻塞版本.我发现自己经常执行以下模式:
这可以完成工作,但是需要花费很多繁琐的代码重复,而且对我来说似乎不是Pythonic.有没有标准的,更好的方法来做到这一点?
一个高度简化的例子来说明我一直在使用的模式:
import ctypes
import Queue
import multiprocessing as mp
class Hardware:
def __init__(
self,
other_init_args):
self.dll = ctypes.cll.LoadLibrary('hardware.dll')
self.dll.Initialize(other_init_args)
def blocking_command(self, arg_1, arg_2, arg_3):
"""
This command takes a long time to execute, and blocks while it
executes. However, while it's executing, we have to coordinate
other pieces of hardware too, so blocking is bad.
"""
self.dll.Takes_A_Long_Time(arg_1, arg_2, arg_3)
def change_settings(self, arg_1, arg_2):
"""
Realistically, there's tons of other functions in the DLL we …Run Code Online (Sandbox Code Playgroud) python multithreading subprocess nonblocking multiprocessing
我最近在我的一台机器上更新了Python的Numpy软件包,显然我已经暂时依赖于numpy的一个不推荐的功能:
>>> np.__version__
'1.10.4'
>>> a = np.ones(10, dtype=np.uint16)
>>> a /= 0.5
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: ufunc 'true_divide' output (typecode 'd') could not be coerced to provided output parameter (typecode 'H') according to the casting rule ''same_kind''
Run Code Online (Sandbox Code Playgroud)
上述链接中的一位评论者指出:
可能意味着你永远不会看到弃用警告;)
......这是正确的,我没有.
但为什么呢?我是如何设法错过弃用警告的?
与文档一致,这个相同的代码在我以前的numpy版本中的工作方式不同:
>>> np.__version__
'1.9.2'
>>> a = np.ones(10, dtype=np.uint16)
>>> a /= 0.5
>>> a
array([2, 2, 2, 2, 2, 2, 2, …Run Code Online (Sandbox Code Playgroud) 我的一位同事希望在他的OS X(10.6)机器上使用我的python 2代码.我的代码导入了几个内置的python包,包括Tkinter和shelve,还使用了第三方包,包括numpy,scipy,matplotlib和ipython.
我在OS X的内置python中遇到了一些问题.(IDLE不起作用,例如*).我怀疑我应该安装更新版本的python,以及不同版本的Tk.
我的问题:
在同一台机器上有两个不同版本的python/Tk会导致问题吗?
我想将终端命令'python','ipython'和'easy_install'与更新版本的python相关联.我该怎么做?
当我使用.dmg文件安装numpy等第三方软件包时,如何控制安装哪个版本的python numpy?
有一个更好的方法吗?
如果这个过程顺利,我会考虑在我的代码文档中添加OS X指令,所以我想把这个过程简化为最简单,最通用的方法.
*编辑:此外,这
编辑:谢谢大家的有用答案.我的同事尝试了MacPorts,它似乎运行良好,但有几个speedbumps.首先,我们必须从系统安装盘安装Xcode.这不是快速或轻量级安装(几GB).幸运的是我们还有磁盘!安装Xcode后,MacPorts易于安装.Python和我们需要的python子包也很容易安装,但他告诉我这个安装需要几个小时.据推测,这种延迟是由于汇编造成的?他很容易将MacPorts python设置为默认值.但是,我认为我们必须手动更改'Python Launcher'应用程序,这似乎仍然默认为系统python.
即使他现在有一个工作系统,我很想让他尝试其他解决方案之一.我不确定我的所有代码的潜在用户是否会容忍多小时,数千兆字节的安装.
我定义了两个简单的 Python 函数,它们接受单个参数、引发异常并处理引发的异常。一个函数在引发/处理之前使用变量来引用异常,另一个函数则不使用:
def refcount_unchanged(x):
try:
raise Exception()
except:
pass
def refcount_increases(x):
e = Exception()
try:
raise e
except:
pass
Run Code Online (Sandbox Code Playgroud)
结果函数之一增加了refcount其输入参数的 pythons,另一个则没有:
import sys
a = []
print(sys.getrefcount(a))
for i in range(3):
refcount_unchanged(a)
print(sys.getrefcount(a))
# prints: 2, 2, 2, 2
b = []
print(sys.getrefcount(b))
for i in range(3):
refcount_increases(b)
print(sys.getrefcount(b))
# prints: 2, 3, 4, 5
Run Code Online (Sandbox Code Playgroud)
谁能解释为什么会发生这种情况?
我想使用ctypes包从64位python中调用msvcrt函数.我显然做错了.这是明智的正确方法吗?
Python 2.7.2 (default, Jun 12 2011, 14:24:46) [MSC v.1500 64 bit (AMD64)] on win
32
Type "help", "copyright", "credits" or "license" for more information.
>>> import ctypes
>>> libc = ctypes.cdll.msvcrt
>>> fp = libc.fopen('text.txt', 'wb') #Seems to work, creates a file
>>> libc.fclose(ctypes.c_void_p(fp))
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
WindowsError: exception: access violation reading 0xFFFFFFFFFF082B28
>>>
Run Code Online (Sandbox Code Playgroud)
如果这个代码做了我想要的,它将打开并关闭一个文本文件而不会崩溃.
This simple application almost does what I want:
import Tkinter as Tk
def hello(x):
print "Hello"
root = Tk.Tk()
root.bind("<Up>", hello)
root.mainloop()
Run Code Online (Sandbox Code Playgroud)
我将向上箭头捣碎,一遍又一遍地打印出"你好".但是,在重复开始之前有一段延迟,重复率比我想要的慢.如何将此重复延迟设置为零?如何控制重复间隔?
我知道其他Tkinter小部件有'repeatdelay'和'repeatinterval'的配置选项,但我似乎找不到一个Tkinter根窗口.
(我正朝你的方向看,布莱恩奥克利)
python ×11
numpy ×3
tkinter ×3
ctypes ×2
subprocess ×2
windows ×2
64-bit ×1
deprecated ×1
dll ×1
exception ×1
graphics ×1
interactive ×1
ipc ×1
ipython ×1
keyboard ×1
macos ×1
msvcrt ×1
nonblocking ×1
pyglet ×1
python-idle ×1
tk-toolkit ×1
warnings ×1