我正在使用 C API 为 Python 开发一个模块。如何创建一个在 Python 中被视为全局的变量?
例如,如果我的模块是module,我想创建一个g执行此任务的变量:
import module
print module.g
Run Code Online (Sandbox Code Playgroud)
尤其,g是一个整数。
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) 我的项目中有两个目录:
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。另外,我不喜欢仅仅为了适应这个项目而进行整个帐户范围的更改。
我正在用 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 函数中包含这样的代码。
作为参考,我附上了两个模块的 …
如何访问 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 程序中将其作为列表进行访问。我怎样才能做到这一点?
如果我当前有一个正在导入的文件:
from foo import f0
from foo.bar import f1
Run Code Online (Sandbox Code Playgroud)
我可以创建一个foo.py包含函数的文件f0来满足第一次导入的需要。
有什么方法可以满足同一文件中的第二次导入吗foo.py?
我对 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 文件。必须有更好的方法要做到这一点...任何帮助都会很棒。谢谢你!
我不确定这是否重要,但作为参考,我正在使用以下版本的东西:
我尝试在我们的持续集成服务器(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 构建一个小型构建系统,为我的 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+ 就可以),但我不知道如何:
任何帮助将不胜感激!
在我的项目中,我有一长串要定价的交易,因此我将其分成多个块并将它们委托给 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) 我有一个用 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 ×10
python-module ×10
c ×2
python-2.7 ×2
python-c-api ×2
debian ×1
linux ×1
pythonpath ×1
scripting ×1
virtualenv ×1