0

我正在使用 Twitter 设计的构建工具来管理我的 monorepo 中的许多项目。它在我完成构建时输出.pex文件,这是一个二进制文件,它打包了我为每个项目所需的最低限度的依赖项,并使它们成为“二进制文件”(实际上是在运行时解压缩的存档),我的问题是我的实用程序使用了很长时间的代码无法检测到我存储在环境库下的一些 .json 文件(现在我正在使用裤子)。我所有的其他代码似乎都运行良好。我很确定这与我的配置有关,也许我没有正确存储资源,所以我的代码可以找到它,尽管当我使用unzip my_app.pex我想要的资源在包中并位于正确的位置(dir)。这是我的实用程序用来加载 json 资源的方法:

if test_env:
    file_name = "test_env.json"
elif os.environ["ENVIRONMENT_TYPE"] == "PROD":
    file_name = "prod_env.json"
else:
    file_name = "dev_env.json"
try:
    json_file = importlib.resources.read_text("my_apps.environments", file_name)
except FileNotFoundError:
    logger.error(f"my_apps.environments->{file_name} was not found")
    exit()
config = json.loads(json_file)

这是我目前用于这些资源的 BUILD 文件:

python_library(
   dependencies=[
       ":dev_env",
       ":prod_env",
       ":test_env"
   ]
 )

resources(
   name="dev_env",
   sources=["dev_env.json"]
)

resources(
   name="prod_env",
   sources=["prod_env.json"]
)

resources(
   name="test_env",
   sources=["test_env.json"]
)

这是调用这些资源的实用程序的 BUILD 文件,上面的 python 代码就是您所看到的:

python_library(
   name="environment_handler",
   sources=["environment_handler.py"],
   dependencies=[
       "my_apps/environments:dev_env",
       "my_apps/environments:prod_env",
       "my_apps/environments:test_env"
   ]
)

我总是收到 FileNotFoundError 异常,我很困惑,因为这些文件可用于运行时,是什么导致这些文件无法访问?并且我需要将 JSON 资源设置为其他格式吗?

这里的上下文也是解压缩的 .pex 文件(实际上只是源代码目录):

    ├── apps
│   ├── __init__.py
│   └── services
│       ├── charts
│       │   ├── crud
│       │   │   ├── __init__.py
│       │   │   └── patch.py
│       │   ├── __init__.py
│       │   └── main.py
│       └── __init__.py
├── environments
│   ├── dev_env.json
│   ├── prod_env.json
│   └── test_env.json
├── __init__.py
├── models
│   ├── charts
│   │   ├── base.py
│   │   └── __init__.py
│   └── __init__.py
└── utils
    ├── api_queries
    │   ├── common
    │   │   ├── connections.py
    │   │   └── __init__.py
    │   └── __init__.py
    ├── calculations
    │   ├── common
    │   │   ├── __init__.py
    │   │   └── merged_user_management.py
    │   └── __init__.py
    ├── environment_handler.py
    ├── __init__.py
    ├── json_response_toolset.py
    └── security_toolset.py
4

1 回答 1

1

我想通了:我改变了访问库中文件的方式,它在构建为 .pex 格式之前和之后都可以正常工作。我用了:

import pkgutil
#json_file = importlib.resources.read_text("my_apps.environments", file_name)
json_file = pkgutil.get_data("my_apps.environments", file_name).decode("utf-8")
于 2021-01-04T18:09:59.157 回答