标签: python-module

通过 C API 在 Python 模块中定义全局变量

我正在使用 C API 为 Python 开发一个模块。如何创建一个在 Python 中被视为全局的变量?

例如,如果我的模块是module,我想创建一个g执行此任务的变量:

import module
print module.g
Run Code Online (Sandbox Code Playgroud)

尤其,g是一个整数。

Alex Martelli 的解决方案

PyObject *m = Py_InitModule("mymodule", mymoduleMethods);
PyObject *v = PyLong_FromLong((long) 23);

PyObject_SetAttrString(m, "g", v);
Py_DECREF(v);
Run Code Online (Sandbox Code Playgroud)

c python python-module global-variables python-c-api

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

自动调用常用初始化代码,无需创建__init__.py文件

我的项目中有两个目录:

project/
  src/
  scripts/
Run Code Online (Sandbox Code Playgroud)

“src”包含我精心编写的代码,“scripts”包含一次性的 Python 脚本。

我希望所有脚本都将“../src”添加到其 sys.path 中,以便它们可以访问“src”树下的模块。一种方法是编写一个 script/__init__.py 文件,其内容为:

scripts/__init__.py:
  import sys
  sys.path.append("../src")
Run Code Online (Sandbox Code Playgroud)

这可行,但会产生不必要的副作用,即将我的所有脚本放入名为“scripts”的包中。还有其他方法可以让我的所有脚本自动调用上述初始化代码吗?

我可以只编辑 .bashrc 中的 PYTHONPATH 环境变量,但我希望我的脚本能够开箱即用,而不需要用户摆弄 PYTHONPATH。另外,我不喜欢仅仅为了适应这个项目而进行整个帐户范围的更改。

python scripting python-module pythonpath

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

python c api 创建 python 模块

我正在用 C 语言编写一个 python 模块,并寻找一种在模块内部编写模块的方法。

PyMODINIT_FUNC
initA(void)
{
PyObject*  pMod, pSubMod;
pMod = Py_InitModule3("A", A_Methods, A_Doc);
pSubMod = PyModule_New("B");
PyModule_AddStringConstant(pSubMod, "__doc__", B_Doc);
PyModule_AddIntConstant(pSubMod, "SOMETHING", 10);
PyModule_AddObject(pMod, "B", pSubMod);
... and so on ...
Run Code Online (Sandbox Code Playgroud)

编译后,我尝试通过各种导入方法访问模块及其常量

>>> import A
>>> print A.B.SOMETHING
10
>>> from A import B
>>> print B.SOMETHING
10
>>> from A.B import *
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: No module named B
Run Code Online (Sandbox Code Playgroud)

前两个听起来很合理,而且工作得很好。然而,最后一个不起作用。我期望我应该有一个相当于__init__.py脚本的代码。但是,我不想编写单独的 .py 文件;相反,我想直接在 C init 函数中包含这样的代码。

作为参考,我附上了两个模块的 …

c python python-module

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

如何访问 Python 的 help('modules') 显示的模块列表?

如何访问 Python 显示的模块列表help('modules')?它显示以下内容:

>>> help('modules')

Please wait a moment while I gather a list of all available modules...

...[list of modules]...
MySQLdb             codeop              mailman_sf          spwd
OpenSSL             collections         markupbase          sqlite3
Queue               colorsys            marshal             sre
...[list of modules]...

Enter any module name to get more help.  Or, type "modules spam" to search
for modules whose descriptions contain the word "spam".

>>>
Run Code Online (Sandbox Code Playgroud)

我可以查看输出中的列表,但希望从 Python 程序中将其作为列表进行访问。我怎样才能做到这一点?

python python-module

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

Python 子模块与模块位于同一文件中

如果我当前有一个正在导入的文件:

from foo import f0
from foo.bar import f1
Run Code Online (Sandbox Code Playgroud)

我可以创建一个foo.py包含函数的文件f0来满足第一次导入的需要。

有什么方法可以满足同一文件中的第二次导入吗foo.py

python python-module python-import

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

使用本地目录覆盖 virtualenv 中的模块

我对 python 相当陌生,遇到了一个无法解决的问题。我有一个依赖于模块 B 的模块 A。通常,A 下载 B 并将其与其余鸡蛋一起存储在我的 virtualenv 站点包中。现在,我想使用 B 的本地版本来代替下载的 B 版本,但无论我做什么,A 仍然在其站点包中使用 B,而不是我在 PYTHONPATH 中指定的包。

我知道我的本地 B 设置正确,因为如果我将它添加到我的 PYTHONPATH 并且我不使用 virtualenv,我就可以很好地使用它。

如果我打开 ipython,并将本地 B 添加到 PYTHONPATH,我会看到我的 sys.path 首先列出了站点包版本,然后是 PYTHONPATH 中的目录。如果我做了一些黑客行为,比如颠倒 sys.path 的顺序并尝试加载 B,它仍然使用站点包中的 B。我发现解决此问题的唯一方法是创建从站点包中的 B 到本地 B 的符号链接,并删除本地 B 中的所有 *.pyc 文件。必须有更好的方法要做到这一点...任何帮助都会很棒。谢谢你!

我不确定这是否重要,但作为参考,我正在使用以下版本的东西:

  • 虚拟环境 12.1.1
  • 蟒蛇2.7
  • 模块A和B是我公司的内部库
  • Ubuntu 12.04.5 LTS

python python-module virtualenv python-2.7

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

如何使用 XML 输出运行 Python 单元测试

我尝试在我们的持续集成服务器(Bamboo,在 Debian Jessie 上运行)上使用 XML 输出运行 Python 单元测试,这样我们就可以根据测试结果将构建标记为失败或成功。我目前正在努力解决我无法安装模块的问题xmlrunner。这就是我所做的

sudo apt-get install python-xmlrunner
python3 
>>> import xmlrunner 
ImportError: No module named 'xmlrunner'
Run Code Online (Sandbox Code Playgroud)

所以我尝试了pip,但它说软件包已经安装

sudo pip install unittest-xml-reporting
Requirement already satisfied (use --upgrade to upgrade): unittest-xml-reporting in /usr/lib/python2.7/dist-packages
Run Code Online (Sandbox Code Playgroud)

顺便说一句,我可以使用 Python 2.7 导入这个模块,这可能意味着这个python-xmlrunner包仅针对 2.7 版本安装。

python3 -m unittest discover project_name我用这样的 main 方法 运行我的测试类unittest.main(testRunner=xmlrunner.XMLTestRunner(output='test-reports'))

python linux debian python-module python-unittest

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

如何使用 importlib 加载带有自定义全局变量的 Python 模块?

我正在尝试用 Python 构建一个小型构建系统,为我的 C++ 项目生成 Ninja 文件。它的行为应该类似于CMake;也就是说,bldfile.py脚本定义规则和目标,并可选择通过调用 递归到一个或多个目录bld.subdir()。每个bldfile.py脚本都有一个对应的bld.File对象。当bldfile.py脚本执行时,bld全局应该被预定义为该文件的bld.File实例,但仅限于该模块的范围

此外,我想以某种方式利用 Python 的字节码缓存,但该.pyc文件应该存储在构建输出目录中,而不是存储在脚本__pycache__旁边的目录中bldfile.py

我知道我应该使用importlib(需要 Python 3.4+ 就可以),但我不知道如何:

  1. 使用自定义全局变量加载并执行模块文件。
  2. 重用字节码缓存基础设施。

任何帮助将不胜感激!

python python-module python-importlib

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

启动 python 多处理池工作线程时发生 ModuleNotFoundError

在我的项目中,我有一长串要定价的交易,因此我将其分成多个块并将它们委托给 multiprocessing#Pool 进行处理。假设包装类称为Valuation,方法是pool_calculate () ,它看起来像:

    multiprocessing.freeze_support() 
    p = multiprocessing.Pool()  # default is a number of processes equal to the number of CPU cores
    results = p.map(self.pooled_valuation_tasks, chunks)
    p.close()
    p.join()
Run Code Online (Sandbox Code Playgroud)

问题是我们必须为所有定价导入一个内部模块,比如magic

import magic
class Valuation(object):
    ....
Run Code Online (Sandbox Code Playgroud)

该模块似乎没有传播到池工作人员中,错误消息如下所示:

Process SpawnPoolWorker-3:
Traceback (most recent call last):
  File "c:\opt\magic0.0.46\PythonVenv\lib\multiprocessing\process.py", line 258, in _bootstrap
    self.run()
  File "c:\opt\magic0.0.46\PythonVenv\lib\multiprocessing\process.py", line 93, in run
    self._target(*self._args, **self._kwargs)
  File "c:\opt\magic0.0.46\PythonVenv\lib\multiprocessing\pool.py", line 108, in worker
    task = get()
  File "c:\opt\magic0.0.46\PythonVenv\lib\multiprocessing\queues.py", line 337, in get
    return _ForkingPickler.loads(res) …
Run Code Online (Sandbox Code Playgroud)

python python-module python-multiprocessing

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

如果放在命名空间包中,子模块的python导入路径

我有一个用 C 编写的 python 模块,它有一个主模块和一个子模块(名称带点,不确定这是否可以称为真正的子模块):

PyMODINIT_FUNC initsysipc(void) {
    PyObject *module = Py_InitModule3("sysipc", ...);
    ...
    init_sysipc_light();
}

static PyTypeObject FooType = { ... };
PyMODINIT_FUNC init_sysipc_light(void) {
    PyObject *module = Py_InitModule3("sysipc.light", ...);
    ...
    PyType_Ready(&FooType);
    PyModule_AddObject(module, "FooType", &FooType);
}
Run Code Online (Sandbox Code Playgroud)

该模块被编译为sysipc.so,当我将它放在当前目录中时,以下导入工作没有问题:

import sysipc
import sysipc.light
from sysipc.light import FooType
Run Code Online (Sandbox Code Playgroud)

问题是我想把这个模块放在一个命名空间包中,文件夹结构是这样的:

company/
company/__init__.py
company/dept/
company/dept/__init__.py
company/dept/sys/
company/dept/sys/__init__.py
company/dept/sys/sysipc.so
Run Code Online (Sandbox Code Playgroud)

所有三个__init__.py只包括标准setuptool导入行:

__path__ = __import__('pkgutil').extend_path(__path__, __name__)
Run Code Online (Sandbox Code Playgroud)

在当前目录中,以下导入不起作用:

from company.dept.sys import sysipc;
from company.dept.sys.sysipc.light import FooType;
Run Code Online (Sandbox Code Playgroud)

sysipc.light在这种情况下,我应该如何导入模块中定义的类型和方法?

====================================

更新实际错误:

我已经sysipc.so …

python python-module python-c-api python-2.7

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