0

我从以下 python 项目中遇到了这个问题:

MyPackage
├──src
|  ├──cust_function.py ----> class, functions
|  ├──__init__.py
|  
|--data --> folder where store raw or processed data
|  |___init__.py
|  |
|---config -> setup folder
|  |-__init__.py
|  |-config.json -> API parameters
| 
└──main.py  -> main file

所以,在 cust_function.py 我有一些类和方法,比如with open(filepath)

def get_file(filepath):
    with open(filepath, 'r') as file:
       ....
    return ....

现在问题来自 main.py,如果我发送这个请求:

from src.cust_function import get_file

filepath = "config/config.json"
get_file(filepath)

结果是 config.json 的 FileNotFoundError

我以不同的方式使用 os.path 和 sys.path 并且没有工作,

fpath = os.path.join(os.path.dirname(__file__), 'src', 'config')
sys.path.append(fpath)

我也用过

sys.path.append(project_name), and doesn't

Or I put same sys.path in __init__.py into config or src folder.


Of course, I tried directly in the same main.py and it works.
The idea is to understand how call methods and send arguments, like filepath, from main script and cust_function works fine.

Thanks.
4

1 回答 1

1

将非 python 文件添加到您的包中并不是那么简单。你永远不知道,你的包是从哪里执行的。特别是如果您稍后实际分发该软件包。对于本地使用,请查看 importlib。我使用以下代码:

from importlib import resources
import json

import config # your package

text = resources.read_text(config, "config.json")
conf = json.loads(text)

我假设你调整 sys.path 来修复你的导入?MyPackage您将其用作命名空间包是否有特殊原因(否__init__.py)?如果您从 MyPackage 的父目录工作,您应该能够使用from MyPackage.src import cust_function. 无需调整sys.path

否则,如果您希望将这些子包分开(然后 MyPackage 是一个奇怪的名称,因为它不是一个包),那么位于该目录中应该使所有子包都可以按原样导入。

如果您位于任意位置,那么您可以export PYTHONPATH=PathToParentDirOfMyPackageexport PYTHONPATH=PathToMyPackage取决于对上述段落的回答。假设您在基于 Unix 的系统(Linux、Mac)和 shell 中运行。

于 2022-01-20T15:15:14.317 回答