标签: cpython

使用Python Tools for Visual Studio进行无堆栈Python开发

用于Visual Studio Beta的Python工具(包括对CPython的支持)是否允许您使用Stackless Python进行开发?

如果是这样,您是否可以扩展您的答案以包括设置无Stackless Python环境所需的任何步骤,而不是在现有的VS2010安装上安装PTVS?

python cpython stackless python-stackless ptvs

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

当前Python实现与Compiled Languages之间的界限

我的理解

C++被编译成机器代码并执行.

Python被编译成字节码

然后执行该字节码

这个执行步骤需要什么?Cpython和PyPy有什么不同?

性能差异在哪里发挥作用?Python的动态类型在性能方面取得了哪些进展?

谢谢!

c++ python compiler-construction pypy cpython

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

CPython源代码 - 如何构建STATIC python26.lib?

我正在尝试使用Cython将我的hello.pyx文件编译为exe.

第一步是使用命令"cython --cplus --embed hello.pyx"将hello.pyx编译成hello.cpp文件.Embed选项意味着Generate a main() function that embeds the Python interpreter.我正在尝试创建一个没有依赖项的独立exe.

在hello.cpp我有一个#include "Python.h",所以我从这里下载的Python来源:http://www.python.org/download/releases/2.6.6/,选择Gzip压缩源焦油球(2.6.6) .我添加了包含dir并获取有关缺少Python26.lib的错误.所以我想编译它.默认构建创建python26.lib,但它只有200 KB,这不是一个静态库,在尝试编译hello.cpp时我得到了缺少的引用错误.

在README中,我没有看到任何有关如何静态构建它的有用指令.但是,我搜索了一个在线README文件,在trunk(3.x)中有最新版本的python,有一些关于静态构建的有用信息:

http://svn.python.org/projects/python/trunk/PCbuild/readme.txt

该解决方案没有静态库的配置.但是,它很容易构建一个静态库而不是DLL.您只需将"配置类型"设置为"静态库(.lib)"并将预处理器宏"Py_ENABLE_SHARED"更改为"Py_NO_ENABLE_SHARED".您可能还必须将"运行时库"从"多线程DLL(/ MD)"更改为"多线程(/ MT)".

但是这里仍然没有太多细节,我是否将解决方案中的所有项目都设置为静态库?还是只有pythoncore?"Python"和"Pythonw"项目是"应用程序",因此我只能将运行时库更改为/ MT.这些是我正在做的步骤:

  • 更改为"发布"模式.
  • Project"Python" - 设置/MT和添加预处理器定义Py_NO_ENABLE_SHARED
  • 项目"Pythoncore" -构型到Static library (.lib),/ MT,代替预处理器定义Py_ENABLE_SHARED与Py_NO_ENABLE_SHARED
  • Project"Pythonw" - 与"Python"中的相同.
  • 我右键单击"Python"构建.

构建摘要:

构建:5成功,1失败,0最新,0跳过

kill_python (ok)
make_buildinfo (ok)
make_versioninfo (ok)
pythoncore (ok)
w9xpopen (ok)
python (4 errors)
Run Code Online (Sandbox Code Playgroud)

失败的项目是"Python",这是日志:

------ Build started: Project: python, Configuration: …
Run Code Online (Sandbox Code Playgroud)

python cpython compilation cython static-linking

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

从已编译的CPython中删除doc字符串但不断言

我想从一个Python程序删除文档字符串,但留下断言(和__debug__切片).我一直在使用-OO标志产生.pyo文件,但根据该文件,消除双方断言和文档字符串.

我正在使用CPython 2.7.

澄清:我正在删除文档字符串作为一种廉价的混淆方法.管理层做出了这个决定,我认为这是否有用是超出了这个问题的范围.

python cpython python-2.x python-2.7

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

Objective-C中的Python-C Api包装器在传递Python对象时会调用__getattr__而崩溃

我正在使用Objective-C编写一个轻量级接口,它能够执行python脚本并在Objective-C和Python之间来回传递数据.我已经研究过PyObjC和ObjP,而且我正在寻找它(因为我正在开发iOS <= 6.0.1.PyObjC将不会编译为大量使用NSMapTable).

所以我基本上在Objective-C中创建了一个名为"ObjC_Class"的Python类型(创意,没有?),我希望这个Python对象几乎类似于ObjC对象.所以我决定覆盖类的__ getattr __函数,这样我就可以访问该类的ObjC等价物的任意方法和属性.

这是代码:

static PyObject * ObjC_Class_getattro(ObjC_Class *self, PyObject *name)
{
    NSString *attrName = [NSString stringWithCString:PyString_AsString(name) encoding:NSUTF8StringEncoding];

    NSLog(@"Calling Object: %@", self->object);
    if([self->object respondsToSelector:NSSelectorFromString(attrName)])
    {
        methodName = attrName;
        //PyObject* (*fpFunc)(PyObject*,PyObject*) = ObjC_Class_msg_send;
        PyMethodDef methd = {[attrName UTF8String],ObjC_Class_msg_send,METH_VARARGS,[attrName UTF8String]};
        PyObject* pyName = PyString_FromString(methd.ml_name);
        PyObject* pyfoo = PyCFunction_NewEx(&methd,(PyObject*)self,pyName);
        Py_DECREF(name);

        return pyfoo;
    }
    else
    {
        return name;
    }
}
Run Code Online (Sandbox Code Playgroud)

现在,当我说:

示例#1

from ObjC import ObjC_Class
new = ObjC_Class('UIView')
new.backgroundColor("asdf", 42, "some_random_string") # This does not crash
Run Code Online (Sandbox Code Playgroud)

但是当我跑步时:

例#2 …

c python cpython objective-c ios

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

CPython - 读取C函数内的Python字典(键/值)作为参数传递

我正在编写Python C扩展.我正在将Python Dictionary传递给C函数.我可以使用以下代码解析它:

PyObject *large_dict = NULL;
if (! PyArg_ParseTuple( args, "O!", &PyDict_Type, &large_dict)) return NULL;
if (large_dict != NULL)
{
   printf("Large Dictionary Not Null\n");
}
Run Code Online (Sandbox Code Playgroud)

这里打印了"Large Dictionary Not Null"语句,这意味着字典被成功解析.现在我想通过指定键来访问字典值,就像在python中一样.即dict ['k1'],这给出了值v1.

如何访问此C函数中的字典键/值?

请建议我一个解决方案?

python cpython python-2.7

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

销毁PyCapsule对象

根据文档,第三个参数PyCapsule_New()可以指定一个析构函数,我假设应该在解压缩时调用它.

void mapDestroy(PyObject *capsule) {

    lash_map_simple_t *map;
    fprintf(stderr, "Entered destructor\n");
    map = (lash_map_simple_t*)PyCapsule_GetPointer(capsule, "MAP_C_API");
    if (map == NULL)
         return;
    fprintf(stderr, "Destroying map %p\n", map);
    lashMapSimpleFree(map);
    free(map);

}

static PyObject * mapSimpleInit_func(PyObject *self, PyObject *args) {

    unsigned int w;
    unsigned int h;
    PyObject *pymap;

    lash_map_simple_t *map = (lash_map_simple_t*)malloc(sizeof(lash_map_simple_t));

    pymap = PyCapsule_New((void *)map, "MAP_C_API", mapDestroy);

    if (!PyArg_ParseTuple(args, "II", &w, &h))
        return NULL;

    lashMapSimpleInit(map, &w, &h);

    return Py_BuildValue("O", pymap);

} 
Run Code Online (Sandbox Code Playgroud)

但是,当我实例化对象并删除它或退出Python控制台时,似乎没有调用析构函数:

>>> a = mapSimpleInit(10,20)
>>> a
<capsule object …
Run Code Online (Sandbox Code Playgroud)

c python cpython

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

是什么使Python3的打印函数线程安全?

我在各种邮件列表和论坛上都看到人们不断提到Python 3中的print函数是线程安全的。通过我自己的测试,我没有理由对此表示怀疑。

import threading
import time
import random

def worker(letter):
    print(letter * 50)


threads = [threading.Thread(target=worker, args=(let,)) for let in "ABCDEFGHIJ"]
for t in threads:
    t.start()
for t in threads:
    t.join()
Run Code Online (Sandbox Code Playgroud)

当我使用Python 3运行它时,即使某些行可能不正常,但它们仍然始终在自己的行上。但是,在Python 2中,输出是零星的。有些线连接在一起或缩进。当我也是如此from __future__ import print_function

我只是想了解为什么会这样?

printing multithreading cpython

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

在C python中,访问字节码评估堆栈

给定一个C Python框架指针,我如何查看任意评估堆栈条目?(某些特定的堆栈条目可以通过找到locals(),我说的是其他堆栈条目。)

不久前,我问了一个更广泛的问题:

获取C python exec参数字符串或访问评估堆栈

但是在这里,我想着重于能够在运行时读取CPython堆栈条目。

我将采用在CPython 2.7或Python 3.3之后的任何Python上均可使用的解决方案。但是,如果您还有其他工作要解决,请分享,如果没有更好的解决方案,我将接受。

我宁愿不修改C Python代码。实际上,在Ruby中,我这样做是为了获得想要的东西。我可以根据经验说,这可能不是我们想要的工作方式。但是,如果没有更好的解决方案,我会考虑的。(我对SO点的理解是,无论哪种方式,我都会以失败的方式失去它。因此,我很高兴看到它表现出最大的精神和意愿去看待这一点(假设它可行)的人。)

更新:请参阅user2357112 tldr的注释;基本上,这是很难做到的。(不过,如果您认为自己有尝试的勇气,请务必这样做。)

因此,让我将范围缩小到我认为可行的这个更简单的问题:

给定python堆栈框架(如)inspect.currentframe(),找到评估堆栈的开始。在C版本的结构中,这是f_valuestack。然后,我们需要使用Python中的一种方法从那里读取Python值/对象。

更新2好赏金的期限已经结束,没有人(包括我自己的简要答案)提供具体的代码。我觉得这是一个良好的开始,现在我对情况的了解比以前要多得多。在强制性的“描述为什么您应该有赏金的描述”中,我列出了其中一种选择,“以引起更多对这个问题的关注”,并且在某种程度上,对于先前化身的看法少于十二种。问题,当我键入此内容时,它已经被查看了不到190次。所以这是成功的。然而...

如果将来有人决定进一步进行此操作,请与我联系,我将设立另一个赏金。

谢谢大家

python bytecode cpython reverse-engineering disassembly

5
推荐指数
2
解决办法
529
查看次数

python源代码的切入点是什么

我想了解python如何工作。所以,我拿了官方的python仓库的分支,可以在下面的Link上找到。我是初学者C程序员。但是,我知道主要是应用程序的入口点。由于python是用编写的c, c++,因此python是main入口点,因此任何人都可以帮助我哪个文件具有该main功能。因此,当我运行时python.exe,首先使用所有命令行参数执行哪个函数?

注意:我不是在要求python程序的入口点。我知道编译器只是开始逐行执行。我想知道的是,当我们运行代码时,python源代码中的哪个函数实际上需要整个python代码对其进行解释并给出结果。

python cpython

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