小编maj*_*588的帖子

Conda 自定义包安装到错误的 python 版本目录中

构建 conda 包并将其安装到新的空环境中后,我的包无法导入,因为它被放置到 python3.8/site-packages 目录中,而环境的 python 可执行文件和所有包依赖项都在 python3.7 下。

从空环境开始:

conda create -n myenv

conda install --use-local mypackage

安装结果如下:

~/miniconda3/envs/myenv/lib/python3.8/site-packages
  |-mypackage/
  |-mypackage-0.0.0-py3.8.egg.info/

~/miniconda3/envs/myenv/lib/python3.7/site-packages
  |- all of the dependencies...
Run Code Online (Sandbox Code Playgroud)

生成的 conda env 也最终将其 python 版本设置为 3.7。显然,现在当我打开 python 控制台并尝试导入我的包时,它失败了。令人困惑的是,我的 meta.yml 中确实有一个导入测试,用于测试导入我的包,该包似乎在 conda 构建过程中通过了。

如果我将我的 meta.yml python 版本固定到它python=3.7而不是python>=3.7它的工作原理。我的包最终与其他所有内容一起安装在 python3.7/site-packages 中,并且工作正常。


我的 meta.yml 中的相关构建要求:

requirements:
    build:
        - setuptools
        - nodejs>=14.5.0
        - mkdocs>=1.1.2
        - mkdocs-material>=5.4.0
        - mkdocs-material-extensions>=1.0
    host:
        - python
    run:
        - python>=3.7
        - rabbitmq-server>=3.7.16
        - pika>=1.1.0
        - pyzmq>=19.0.1
        - pyyaml>=5.3.1 …
Run Code Online (Sandbox Code Playgroud)

python packaging anaconda conda miniconda

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

如何使用ctypes将NumPy复杂数组与C函数连接?

我在C中有一个函数,它接受一系列复杂的浮点数并对它们进行就地计算:

/* foo.c */
void foo(cmplx_float* array, int length) {...}
Run Code Online (Sandbox Code Playgroud)

复杂的float结构如下所示:

typedef struct cmplx_float {
   float real;
   float imag;
} cmplx_float ;
Run Code Online (Sandbox Code Playgroud)

我需要使用ctypes在python中调用该函数.在Python中,我有一个复杂64元素的Numpy 1-D ndarray.

我还创建了一个派生自ctypes的类.结构:

class c_float(Structure):
   _fields_ = [('real', c_float),
               ('imag', c_float)]
Run Code Online (Sandbox Code Playgroud)

我想我可能需要另一个实现结构数组的python类.总的来说,我只是将这些碎片连接在一起时遇到了问题.最终需要做什么才能在Python中调用我的函数,或多或少是这样的:

some_ctype_array = SomeConversionCode(cmplx_numpy_array) 
lib.foo(some_ctype_array, length)
Run Code Online (Sandbox Code Playgroud)

c python ctypes numpy

4
推荐指数
1
解决办法
1166
查看次数

是否有一种非阻塞方式来检查 asyncio 子进程是否还活着?

当使用asyncio.create_subprocess_exec一个asyncio.subprocess.process被返回。该文档表明不存在pollis_alive类型方法。它似乎waitcommunicate提供了查看进程是否正在运行的唯一方法,但它们正在阻止调用,并且通信的 asyncio 版本没有超时选项。

有没有一种好方法来检查asyncio进程是否以非阻塞方式活着?

我能想到的最好的is_alive样式函数是:

import asyncio

async def is_alive(proc):
    try:
        await asyncio.wait_for(proc.wait(), 0.001)
    except asyncio.TimeoutError:
        return True
    else:
        return False
Run Code Online (Sandbox Code Playgroud)

虚拟用例:

async def foo():
    proc = await asyncio.create_subprocess_exec('sleep', '5')
    i = 0
    res = True
    while res:
        res = await is_alive(proc)
        print(f"[{i}] is_alive: {res}")
        # ... do foo stuff while we wait ...
        await asyncio.sleep(1)
        i += …
Run Code Online (Sandbox Code Playgroud)

python subprocess python-3.x python-asyncio

4
推荐指数
1
解决办法
897
查看次数