小编Ery*_*Sun的帖子

在python中对具有特定语言环境的字符串列表进行排序

我在使用来自不同语言的文本的应用程序,因此,为了查看或报告目的,某些文本(字符串)需要以特定语言进行排序.

目前我有一个解决方法搞乱全局区域设置,这是不好的,我不想把它投入生产:

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 ctypes locale glibc

9
推荐指数
3
解决办法
4433
查看次数

从Python调用的C函数发出返回值

看似简单的问题我有困难.我需要从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)

在我的实际测试功能中,我打印val1val2以确保它们正在接收值.一切都很好.调用此函数的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不喜欢返回的结果.

我缺少什么想法?

python ctypes

9
推荐指数
1
解决办法
7167
查看次数

单个应用程序C++的多个控制台

是否可以创建两个控制台窗口(一个是主要的),而辅助是一个弹出窗口,如Windows窗体中的消息框?

我只希望辅助控制台窗口保存ID(将硬编码到应用程序中)因此用户无需继续返回主菜单来检查可用ID

如果是这样你会怎么做呢?

非常感谢

c++ windows console-application windows-console

9
推荐指数
1
解决办法
2万
查看次数

如何打包分发使用共享库的python模块?

我正在为C库编写一些绑定,并且我不确定如何配置所有这些以进行分发,因此可以使用pip install我的包.

假设我有以下文件:

  • library.c
  • library.h
  • wrapper.py

为了使我的包装器库工作,有必要:

  • 编译library.c并创建一个共享库
  • 运行ctypesgenlibrary.h生成ctypes的代码

以下是命令:

  • gcc -Wall -fPIC -c library.c
  • gcc -shared -Wl,-soname,liblibrary.so.1 -o liblibrary.so.1.0 library.o
  • ctypesgen.py library.h -L ./ -l library -o _library.py

运行setup.py还取决于已安装的用户ctypesgen.

我不知道如何设置这一切,以便对图书馆感兴趣的人可以简单地pip install library自动完成所有这些.有人能帮忙吗?

python ctypes distutils setuptools

9
推荐指数
1
解决办法
1061
查看次数

从Python访问C声明的嵌套结构

我在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个级别,我想简化这里的插图.

c python swig ctypes

8
推荐指数
1
解决办法
1324
查看次数

Windows 10和pip升级 - 访问被拒绝

我做了一个全新的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)

python windows pip

8
推荐指数
2
解决办法
1万
查看次数

如何使用Anaconda Python来执行.py文件?

我刚刚在Windows计算机上下载并安装了Anaconda.但是,我在使用命令提示符执行.py文件时遇到问题.如何让我的计算机了解python.exe应用程序在Anaconda文件夹中,以便它可以执行我的.py文件?

python windows anaconda

8
推荐指数
2
解决办法
3万
查看次数

使用“cmd /c”但隐藏控制台窗口

单击时,我有一个运行此命令的快捷方式:cmd /c "full path to my batch file"。当我使用它时,它会做它应该做的事情,但在此过程中会弹出丑陋的控制台窗口。有没有办法让这个命令启动一个隐藏的或至少最小化的窗口?

cmd windows-console

8
推荐指数
4
解决办法
3万
查看次数

subprocess.Popen使用unicode路径

我有一个我想打开的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)

即使该文件确实存在.为什么会这样?

python windows unicode command-line subprocess

7
推荐指数
1
解决办法
9140
查看次数

Python可写缓冲区/内存视图到数组/ bytearray/ctypes字符串缓冲区

问题:

  • 固定大小记录的二进制数据
  • 想要使用struct.unpack_from和struct.pack_into来操作二进制数据
  • 不需要数据的副本
  • 想要多次查看内存以简单地抵消计算等.
  • 数据可以在array.array bytearray或ctypes字符串缓冲区中

我试图做的:

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 ctypes bytearray python-2.7

7
推荐指数
1
解决办法
7326
查看次数