微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为什么Python 3中的子进程不会执行bash下标而会挂在上面?我正在尝试在我自己的 Apple M1 库路径解析器中使用它

如何解决为什么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_PATHGEOS_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 举报,一经查实,本站将立刻删除。