小编Ery*_*Sun的帖子

将2D可变长度数组传递给Python和C的好方法?

通过一些黑客攻击,我使用python c-types在Python和C之间来回传递数据.这看起来有点混乱,所以我希望有更多经验的人可以告诉我,如果我做错了什么,或者让它变得比它需要的更难.

Python代码:

from ctypes import cdll, POINTER, byref, c_double
lib = cdll.LoadLibrary('./test.so')

def alloc_arrays(length, python_list):
    # Create array of float*
    data = ((POINTER(c_double)) * length)()
    out_data = ((POINTER(c_double)) * length)()
    for i in xrange(length):
        # Create arrays of float
        data[i] = (c_double * 3)()
        out_data[i] = (c_double * 3)()
        # Set Values
        for j in xrange(3):
            data[i][j] = python_list[i][j]
            out_data[i][j] = 0.0
    return data, out_data

if __name__ == "__main__":
    a = [[1.0, 11.0, 21.0],
         [2.0, 12.0, 22.0],
         [3.0, 13.0, …
Run Code Online (Sandbox Code Playgroud)

c python ctypes

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

6
推荐指数
0
解决办法
8307
查看次数

在npm运行时设置Windows控制台的标题是否很热?

我已经开始在我的Windows机器上开发一个Web应用程序项目,我使用npm,bowernodejs HTTP服务器.

为了便于启动HTTP服务器,我创建了批处理文件:

@echo off
title HTTP Server
npm start
Run Code Online (Sandbox Code Playgroud)

npm start开始了http-server.为此,我在以下条目packages.json:

"start": "http-server -a localhost -p 8000 -c-1"
Run Code Online (Sandbox Code Playgroud)

但是,当我双击批处理时,打开控制台窗口的标题首先更改为npm然后更改为bower.因此它在npm/ bower正在运行时忽略了我自己的标题.

由于我打开了很多控制台窗口,我想强制HTTP server控制台窗口拥有我的特定标题.我怎样才能做到这一点?

windows batch-file node.js npm

6
推荐指数
2
解决办法
2372
查看次数

如何在python中获取驱动器的名称

我有一个有效的驱动器号列表,我想向最终用户提供一个选择.我想向他们展示驱动器的名称.这里有一些代码可以显示驱动器的名称F:\:

import ctypes

kernel32 = ctypes.windll.kernel32
buf = ctypes.create_unicode_buffer(1024)

kernel32.GetVolumeNameForVolumeMountPointW(
    ctypes.c_wchar_p("F:\\"),
    buf,
    ctypes.sizeof(buf)
)

print buf.value
Run Code Online (Sandbox Code Playgroud)

但是,这个输出\\?\Volume{a8b6b3df-1a63-11e1-9f6f-0007e9ebdfbf}\.如何获取Windows在资源管理器中显示的字符串(例如KINGSTON,对于我拥有的某个闪存驱动器)?


编辑:

还是行不通:

volumeNameBuffer = ctypes.create_unicode_buffer(1024)
fileSystemNameBuffer = ctypes.create_unicode_buffer(1024)

kernel32.GetVolumeInformationW(
    ctypes.c_wchar_p("C:\\"),
    volumeNameBuffer,
    ctypes.sizeof(volumeNameBuffer),
    fileSystemNameBuffer,
    ctypes.sizeof(fileSystemNameBuffer)
)
Run Code Online (Sandbox Code Playgroud)

这给了我这个错误:

WindowsError: exception: access violation reading 0x3A353FA0
Run Code Online (Sandbox Code Playgroud)

python windows ctypes

5
推荐指数
3
解决办法
9765
查看次数

Python ctypes加载错误:未定义的符号

我试图用ctypes将从C源编译的共享库加载到Python中.共享库(下面名为" libsub.so ")使用了libusb库.这就是"make"所做的:

gcc -c -O2 -Wall -Werror -g -I../src -I../boot/vnd/fw -I. -fPIC -DLIBUSB_1_0 -I/usr/include/libusb-1.0 -o libsub.o libsub.c
gcc -shared -Wl,-soname,libsub.so -o libsub.so libsub.o
Run Code Online (Sandbox Code Playgroud)

之后我尝试了Python:

import ctypes
h = ctypes.cdll.LoadLibrary('./libsub.so')
Run Code Online (Sandbox Code Playgroud)

但是,我收到了这样的错误

OSError: ./libsub.so: undefined symbol: libusb_open

我发现"libusb_open"实际上是"/usr/include/libusb-1.0/libusb.h"中libusb头的一个函数,它已经包含在这个库"libsub.c"的源代码中.

在使用ctypes加载C++共享库时,StackExchange中的一些帖子讨论了这种"未定义的符号"错误,并且通过将编译器从gcc更改为g ++来解决问题.但是,我的源代码是用C语言编写的 - 所以它可能是一个不同的情况(实际上我尝试使用g ++编译这个源代码但得到了一堆错误).任何人都可以指出我在这里失踪了吗?谢谢!

python ctypes

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

python ctypes - 传递numpy数组 - 奇数输出

我正在使用ctypes,我正在将一个ndarray传递给一个c函数.它给了我奇怪的输出行为.下面是一些代码:

C-功能:

int foo(int * foo,int N){
for(int i=0;i<N;i++){
    cout << "i " << i  << " "<< foo[i]  << endl;
    }
return 0;
}
Run Code Online (Sandbox Code Playgroud)

蟒蛇:

from ctypes import *
import numpy as np
bar = cdll.LoadLibrary(".../libtest.so")
N = c_int(10)
check = np.ones(10, dtype=int)
print check
bar.foo(c_int(check.ctypes.data),N)
Run Code Online (Sandbox Code Playgroud)

输出:

[1 1 1 1 1 1 1 1 1 1]
i:0 out:1
i:1 out:0
i:2 out:1
i:3 out:0
i:4 out:1
i:5 out:0
i:6 out:1
i:7 out:0
i:8 out:1
i:9 out:0
Run Code Online (Sandbox Code Playgroud)

一切都对吗?:)

我正在编译 …

python ctypes numpy

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

在Python中读取和/或更改Windows 8 Master Volume

如何使用python更改笔记本电脑上的主音量?我知道一种方法,我使用ctypes模拟音量增大/音量减小按键,但不知道当前的音量,每当我启动应用程序进行校准时,我必须让我的代码执行50次连续的音量低调按键它归零.

有没有办法让我获得当前系统音量,或者更好,将主音量设置为指定值?

我正在使用Python 3.4运行Windows 8 64位系统.

python windows python-3.x windows-8

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

ctypes 如何知道何时抛出 ArgumentError,但只是有时?

我正在尝试 ctypes,发现了一些让我困惑的事情。我有一个导出此函数的 .so 文件:

\n\n
void hello(int a) {\n    printf("hello, a=%d", a);\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

我从 Python 中调用它,但我输入了错误类型的参数来看看会发生什么:

\n\n
mydll = ctypes.CDLL("libhello.so")\nmydll.hello(\'this is string\')\n
Run Code Online (Sandbox Code Playgroud)\n\n

这不会引发错误,只会打印hello, a=-1219868708. 但是如果我传递一个 double 而不是 \xe2\x80\x93 mydll.hello(1.0),那么它会抛出异常:

\n\n
ctypes.ArgumentError: 参数 1: : 不知道如何转换参数 1
\n\n

我觉得很奇怪,因为导出的 C 函数通常没有有关其签名的信息(与 C++ 函数不同),只有函数的名称以及参数的总字节数。

\n\n

因此,我认为 ctypes 可能正在计算字节数以确保某种类型安全措施,因此我尝试传递 2 个字符串 \xe2\x80\x93 mydll.hello(\'string1\', \'string2\'),并且再次没有错误;它刚刚打印出来hello, a=-1223698284

\n\n

所以现在我很困惑。ctypes 究竟检查了什么,以便它知道 adouble是错误的,但同时不知道 2 个字符串不是错误的?

\n

python ctypes

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

使用python将文件复制到Windows中的sytem文件夹

我必须将DLL文件复制到C:\ Windows\System32文件夹.我得到许可拒绝错误.除了以管理员身份运行脚本之外,还有其他方法吗?

这不起作用:

import os
import sys
import shutil 
import win32com.shell.shell as shell 

ASADMIN = 'asadmin' 

if sys.argv[-1] != ASADMIN: 
    script = os.path.abspath(sys.argv[0]) 
    params = ' '.join([script] + sys.argv[1:] + [ASADMIN]) 
    print "params : ", params, " script : ", script
    shell.ShellExecuteEx(lpVerb='runas', 
                         lpFile=sys.executable, 
                         lpParameters=params) 

print "I am root now." 
nvcudadll = "C:\\Users\\alankritag\\Desktop\\abc.dll" 
winpath = os.environ['WINDIR'] + "\\System32"
shutil.copyfile(nvcudadll, winpath)
Run Code Online (Sandbox Code Playgroud)

python windows

5
推荐指数
0
解决办法
750
查看次数

Windows Python解释器在Ctrl + C上退出

对于我使用的大多数Python解释器,Ctrl + C都会使解释器打印出“ KeyboardInterrupt”并保持打开状态。但是,在新计算机上的最新安装中,Ctrl + C导致解释器退出,这是不希望的。

  • 设置signal.SIGINT处理程序仍然存在。
  • 没有正在运行的启动脚本可以调整行为。
  • raise KeyboardInterrupt 不退出解释器。
  • Ctrl + C上不会发出任何文本。在Ctrl + Break上,^C在退出之前发出。

如果在以下代码片段的打sn过程中按Ctrl + C,则解释器将保持打开状态。

import time

try:
    time.sleep(100)
except KeyboardInterrupt:
    pass
Run Code Online (Sandbox Code Playgroud)

环境:Windows 10上的Python 3.4.3

python windows windows-console

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