我在使用来自不同语言的文本的应用程序,因此,为了查看或报告目的,某些文本(字符串)需要以特定语言进行排序.
目前我有一个解决方法搞乱全局区域设置,这是不好的,我不想把它投入生产:
default_locale = locale.getlocale(locale.LC_COLLATE)
def sort_strings(strings, locale_=None):
if locale_ is None:
return sorted(strings)
locale.setlocale(locale.LC_COLLATE, locale_)
sorted_strings = sorted(strings, cmp=locale.strcoll)
locale.setlocale(locale.LC_COLLATE, default_locale)
return sorted_strings
Run Code Online (Sandbox Code Playgroud)
官方python语言环境文档明确说明保存和恢复是一个坏主意,但没有给出任何建议:http://docs.python.org/library/locale.html#background-details-hints-tips-and-caveats
看似简单的问题我有困难.我需要从Python代码调用各种C函数.目前,我正试图通过ctypes来做到这一点.我遇到了一个简单的示例实现问题,我正在使用它来确保在更改大块现有代码之前一切都按预期工作.C函数采用一些参数,进行各种数学计算,然后返回一个double值.这是我用作测试的C文件.
#include "Python.h"
double eval(double* args, int length, double* rands, int randLength, int debug)
{
double val1 = args[0];
double val2 = rands[0];
double ret = val1 + val2;
return ret;
}
Run Code Online (Sandbox Code Playgroud)
在我的实际测试功能中,我打印val1和val2以确保它们正在接收值.一切都很好.调用此函数的Python如下所示.
test = ctypes.CDLL("/home/mjjoyce/Dev/C2M2L/AquaticWavesModel.so")
rand = Random();
args = [2]
argsArr = (ctypes.c_double * len(args))()
argsArr[:] = args
argsRand = [rand.random()]
argsRandArr = (ctypes.c_double * len(argsRand))()
rgsRandArr[:] = argsRand
result = test.eval(argsArr, len(argsArr), argsRandArr, len(argsRandArr), 0)
print "result", result
Run Code Online (Sandbox Code Playgroud)
当打印返回的结果时,它通常会转储一个大的负数.这是我的假设,我需要在Python处理该值之前进行一些转换,但是我无法找到适合我生活的答案.我一直在搜索,但我不确定我是否错过了明显的信息,或者搜索错误的信息.
此外,如果我将函数的返回类型更改为int,则计算结果正确并返回int并按预期打印.如果我将它设置为double,则C代码中的计算是正确的(我打印它们进行检查),但Python不喜欢返回的结果.
我缺少什么想法?
是否可以创建两个控制台窗口(一个是主要的),而辅助是一个弹出窗口,如Windows窗体中的消息框?
我只希望辅助控制台窗口保存ID(将硬编码到应用程序中)因此用户无需继续返回主菜单来检查可用ID
如果是这样你会怎么做呢?
非常感谢
我正在为C库编写一些绑定,并且我不确定如何配置所有这些以进行分发,因此可以使用pip install我的包.
假设我有以下文件:
library.clibrary.hwrapper.py为了使我的包装器库工作,有必要:
ctypesgen上library.h生成ctypes的代码以下是命令:
gcc -Wall -fPIC -c library.cgcc -shared -Wl,-soname,liblibrary.so.1 -o liblibrary.so.1.0 library.octypesgen.py library.h -L ./ -l library -o _library.py运行setup.py还取决于已安装的用户ctypesgen.
我不知道如何设置这一切,以便对图书馆感兴趣的人可以简单地pip install library自动完成所有这些.有人能帮忙吗?
我在C中静态声明了一个大型结构,但我需要使用相同的数据在Python中进行一些分析.我宁愿不将这些数据重新复制到Python中以避免错误,有没有办法直接在Python中访问(只读)这些数据?我看过"ctypes"和SWIG,他们似乎都没有提供我正在寻找的东西......
例如,我有:
/*.h文件*/
typedef struct
{
double data[10];
} NestedStruct;
typedef struct
{
NestedStruct array[10];
} MyStruct;
Run Code Online (Sandbox Code Playgroud)
/*.c文件*/
MyStruct the_data_i_want =
{
{0},
{
{1,2,3,4}
},
{0},
};
Run Code Online (Sandbox Code Playgroud)
理想情况下,我想要的东西可以让我把它变成python并通过the_data_i_want.array[1].data[2]类似的东西访问它.有什么想法吗?从我能够编译/导入从我的.c文件创建的.so这个意义上来说,我已经开始"工作",但是我无法通过cvars访问它.也许有另一种方式?看起来这不应该那么难......
实际上,我想通了.我添加这个是因为我的声誉不允许我在8小时内回答我自己的问题,因为我不想在8小时内记住,我现在就加上它.我确信有一个很好的理由,我不明白.
弄清楚了.
我将我的.c文件编译成一个库:
然后,我使用类型来定义一个保存数据的python类:
from ctypes import *
class NestedStruct(Structure):
_fields_ = [("data", c_double*10)]
class MyStruct(Structure):
_fields_ = [("array", NestedStruct*10)]
Run Code Online (Sandbox Code Playgroud)
然后,我将共享库加载到python中:
my_lib = cdll.LoadLibrary("my_lib.so")
Run Code Online (Sandbox Code Playgroud)
然后,我使用"in_dll"方法来获取数据:
the_data_i_want = MyStruct.in_dll(my_lib, "the_data_i_want")
Run Code Online (Sandbox Code Playgroud)
然后,我可以访问它,就像它是C. the_data_i_want.array[1].data[2]
注意我可能在这里稍微搞砸了语法,因为我的实际数据结构嵌套了3个级别,我想简化这里的插图.
我做了一个全新的Windows 10安装,安装了python,cygwin和一个名为ConEmu的改进控制台.安装python 3.4.3后我执行:
pip install -U pip
Run Code Online (Sandbox Code Playgroud)
并得到了这个错误.
File "C:\Anwendungsentwicklung\Python34\lib\site-packages\pip\utils\__init__.py", line 70, in rmtree_errorhandler
os.makedirs(path)
PermissionError: [WinError 5] Zugriff verweigert: 'C:\\Users\\ADMINI~1\\AppData\\Local\\Temp\\pip-dxm8d3xg-uninstall\\anwendungsentwicklung\\python34\\scripts\\pip.exe'
Run Code Online (Sandbox Code Playgroud)
我使用预定义的管理员帐户登录,临时目录以及Python的安装目录(C:\ Anwendungsentwicklung\Python34)具有完全访问权限.
请通过设置不同的权限测试所有变体,但Windows不会让我.我甚至在安全选项卡中添加了"Everyone",但这并没有帮助,尽管我记得它正在使用Windows 7进行这种"技巧".它一定是Windows 10的问题.有人可以帮忙吗?
这是完全追溯
Exception:
Traceback (most recent call last):
File "c:\anwendungsentwicklung\python34\lib\shutil.py", line 372, in _rmtree_unsafe
os.unlink(fullname)
PermissionError: [WinError 5] Zugriff verweigert: 'C:\\Users\\ADMINI~1\\AppData\\Local\\Temp\\pip-k7g0hd6t- uninstall\\anwendungsentwicklung\\python34\\scripts\\pip.exe'
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "c:\anwendungsentwicklung\python34\lib\site-packages\pip\basecommand.py", line 232, in main
logger.critical('Operation cancelled by user')
File "c:\anwendungsentwicklung\python34\lib\site-packages\pip\commands\install.py", line 347, in run
ensure_dir(options.target_dir)
File "c:\anwendungsentwicklung\python34\lib\site-packages\pip\req\req_set.py", …Run Code Online (Sandbox Code Playgroud) 我刚刚在Windows计算机上下载并安装了Anaconda.但是,我在使用命令提示符执行.py文件时遇到问题.如何让我的计算机了解python.exe应用程序在Anaconda文件夹中,以便它可以执行我的.py文件?
单击时,我有一个运行此命令的快捷方式:cmd /c "full path to my batch file"。当我使用它时,它会做它应该做的事情,但在此过程中会弹出丑陋的控制台窗口。有没有办法让这个命令启动一个隐藏的或至少最小化的窗口?
我有一个我想打开的unicode文件名.以下代码:
cmd = u'cmd /c "C:\\Pok\xe9mon.mp3"'
cmd = cmd.encode('utf-8')
subprocess.Popen(cmd)
Run Code Online (Sandbox Code Playgroud)
回报
>>> 'C:\Pok?mon.mp3' is not recognized as an internal or external command, operable program or batch file.
Run Code Online (Sandbox Code Playgroud)
即使该文件确实存在.为什么会这样?
问题:
我试图做的:
part1 = buffer(binary_data, 0, size1)
part2 = buffer(binary_data, size1, size2)
part3 = buffer(binary_data, size1 + size2) # no size is given for this one as it should consume the rest of the buffer
struct.pack_into('I', part3, 4, 42)
Run Code Online (Sandbox Code Playgroud)
这里的问题是struct.pack_into抱怨只读缓冲区.我已经查看了内存视图,因为它们可以创建读/写视图,但是它们不允许您像缓冲区函数那样指定偏移量和大小.
如何使用struct.unpack_from和struct.pack_into将多个零拷贝视图添加到可读,可写且可以访问/修改的字节缓冲区中
python ×8
ctypes ×5
windows ×4
anaconda ×1
bytearray ×1
c ×1
c++ ×1
cmd ×1
command-line ×1
distutils ×1
glibc ×1
locale ×1
pip ×1
python-2.7 ×1
setuptools ×1
subprocess ×1
swig ×1
unicode ×1