如何解决为什么Python 3中的子进程不会执行bash下标而会挂在上面?我正在尝试在我自己的 Apple M1 库路径解析器中使用它
所以,我在我的工作场所使用了带有 M1 的 Mac 进行编程,它需要一些解决方法来运行代码(不仅是 Rosetta,因为您需要解析环境变量中的库 LD/C/CPP 路径)。我基本上在 bash 中推出了自己的解决方法,它能够轻松运行 x86 命令(我称之为 runx86):
#!/bin/bash
CMD=$@ arch -x86_64 /bin/bash --rcfile <(echo '
export PATH="/usr/local/bin:$PATH"
export LDFLAGS="-L/usr/local/opt/zlib/lib"
export LDFLAGS="$LDFLAGS -L/usr/local/opt/bzip2/lib"
export LDFLAGS="$LDFLAGS -L/usr/local/opt/openssl@1.1/lib"
export CFLAGS="-I/usr/local/opt/zlib/include"
export CFLAGS="$CFLAGS -I/usr/local/opt/bzip2/include"
export CFLAGS="$CFLAGS -I/usr/local/opt/openssl@1.1/include"
export CFLAGS="$CFLAGS -I$(xcrun --show-sdk-path)/usr/include -Wno-implicit-function-declaration"
export CPPFLAGS="-I/usr/local/opt/zlib/include"
export CPPFLAGS="$CPPFLAGS -I/usr/local/opt/bzip2/include"
export CPPFLAGS="$CPPFLAGS -I$(xcrun --show-sdk-path)/usr/include -Wno-implicit-function-declaration"
$CMD
exit
')
基本上它解析公共库路径和运行命令(指定为不是首先使用 $@ 变量的每个参数)。 它适用于例如运行 Python 3.6 并编写 django 项目。
我遇到了什么问题 - 因为我有两个 brew,一个在 Rosetta 模式下运行,第二个在本地运行,即使我使用我的解决方法,它仍然调用 /opt/homebrew 中的 .dylib
库。这不是我的愿望。例如 - django 中的 GDAL/GEOS 库路径是错误的(在变量 GDAL_LIBRARY_PATH
和 GEOS_LIBRARY_PATH
中)。
所以我带着自己的库解析器来了:
"""Python library resolver."""
import subprocess
def resolve_library(name):
result = subprocess.run(['brew','ls',name],stdout=subprocess.PIPE).stdout.decode('utf-8')
try:
return [item for item in result.splitlines() if item.endswith(f'{name}.dylib')][0]
except IndexError:
pass
return None
# example usage:
# print(resolve_library('gdal'))
我想像这样使用它:
GDAL_LIBRARY_PATH = resolve_library('gdal')
GEOS_LIBRARY_PATH = resolve_library('geos','geos_c')
但是,由于某种原因,当我的第一个参数是 subprocess.run - runx86
中的 (['runx86','brew',...])
(rosetta 解决方案)时,它只是挂起,我不知道为什么。也许这个问题有更好的解决方案?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。