gpt4 book ai didi

python - 这是访问与 Python 脚本相邻/打包的数据的批准方式吗?

转载 作者:太空狗 更新时间:2023-10-29 21:27:43 25 4
gpt4 key购买 nike

我有一个 Python 脚本,它需要一些数据存储在一个文件中,该文件始终与脚本位于同一位置。我有一个脚本的 setup.py,我想确保它可以 pip 安装在各种环境中,并且可以在必要时转换为独立的可执行文件。

目前该脚本使用 Python 2.7 和 Python 3.3 或更高版本运行(尽管我没有 3.3 的测试环境,所以我不能确定这一点)。

我想出了这个方法来获取数据。这个脚本不是包含 __init__.py 或任何东西的模块目录的一部分,它只是一个独立的文件,如果直接用 python 运行就可以工作,但也有一个setup.py 文件中定义的入口点。都是一个文件。这是正确的方法吗?

def fetch_wordlist():
wordlist = 'wordlist.txt'
try:
import importlib.resources as res
return res.read_binary(__file__, wordlist)
except ImportError:
pass
try:
import pkg_resources as resources
req = resources.Requirement.parse('makepw')
wordlist = resources.resource_filename(req, wordlist)
except ImportError:
import os.path
wordlist = os.path.join(os.path.dirname(__file__), wordlist)
with open(wordlist, 'rb') as f:
return f.read()

这看起来复杂得离谱。此外,它似乎以我不满意的方式依赖包管理系统。该脚本不再有效,除非它是 pip 安装的,而且这似乎也不可取。

最佳答案

存在于文件系统中的资源

读取与 python 脚本相邻的文件的标准方法是:

a) 如果你有 python>=3.4,我建议你使用 pathlib模块,像这样:

from pathlib import Path


def fetch_wordlist(filename="wordlist.txt"):
return (Path(__file__).parent / filename).read_text()


if __name__ == '__main__':
print(fetch_wordlist())

b) 如果您仍在使用 python 版本 <3.4,或者您仍然想使用旧的 os.path模块你应该做这样的事情:

import os


def fetch_wordlist(filename="wordlist.txt"):
with open(os.path.join(os.path.dirname(__file__), filename)) as f:
return f.read()


if __name__ == '__main__':
print(fetch_wordlist())

另外,我建议你在外部调用者中捕获异常,上面的方法是在 python 中读取文件的标准方法,所以你不需要将它们包装在像 fetch_wordlist 这样的函数中,说否则,在 python 中读取文件是一个“原子”操作。

现在,您可能会使用一些卡住器卡住您的程序,例如 cx_freezepyinstallersimilars ...在那种情况下你需要检测它,这里有一个简单的方法来检查它:

a) 使用 os.path:

if getattr(sys, 'frozen', False):
app_path = os.path.dirname(sys.executable)
elif __file__:
app_path = os.path.dirname(__file__)

b) 使用路径库:

if getattr(sys, 'frozen', False):
app_path = Path(sys.executable).parent
elif __file__:
app_path = Path(__file__).parent

压缩文件中的资源

如果代码存在于文件系统中,上述解决方案将起作用,但如果包存在于 zip 文件中,则上述解决方案将不起作用,当发生这种情况时,您可以使用 importlib.resources (3.7 版新增)或 pkg_resources正如您已经在问题中展示的那样(或者您可以使用一些帮助程序)或者您可以使用一个名为 importlib_resources 的不错的第 3 方库,它应该适用于旧的和现代的 python 版本:

特别针对您的特定问题,我建议您看看这个 https://importlib-resources.readthedocs.io/en/latest/using.html#file-system-or-zip-file .

如果您想知道那个库在幕后做了什么,因为您不愿意安装任何第 3 方库,您可以找到 py2 的代码 here和 py3 here如果您想获得针对您的特定问题的相关信息

关于python - 这是访问与 Python 脚本相邻/打包的数据的批准方式吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55564418/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com