构建 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) 我在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) 当使用asyncio.create_subprocess_exec一个asyncio.subprocess.process被返回。该文档表明不存在poll或is_alive类型方法。它似乎wait或communicate提供了查看进程是否正在运行的唯一方法,但它们正在阻止调用,并且通信的 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 ×3
anaconda ×1
c ×1
conda ×1
ctypes ×1
miniconda ×1
numpy ×1
packaging ×1
python-3.x ×1
subprocess ×1