【问题标题】:How to have persistent storage for a PYPI package如何为 PYPI 包提供持久存储
【发布时间】:2020-06-09 20:59:55
【问题描述】:

我有一个名为 collectiondbf 的 pypi 包,它使用用户输入的 API 密钥连接到 API。它在目录中用于下载文件,如下所示:

python -m collectiondbf [myargumentshere..]

我知道这应该是基本知识,但我真的坚持这个问题:

如何以有意义的方式保存用户给我的密钥,这样他们就不必每次都输入?

我想通过config.json 文件使用以下解决方案,但如果我的包将移动目录,我怎么知道该文件的位置?

这是我想使用它的方式,但显然它不会工作,因为工作目录会改变

import json
if user_inputed_keys:
    with open('config.json', 'w') as f:
        json.dump({'api_key': api_key}, f)

【问题讨论】:

  • 要求用户将 API 密钥存储在环境变量中,而不是通过命令行参数传递它。从安全的角度来看,这也比将其存储在磁盘上的任何位置更可取。
  • 谢谢@ksbg 我已经有了这个选项。我只是想一定有一种方法可以为他们存储它?
  • 用户主目录可能是您最好的选择,例如.mypkg/.apiimport os print(os.path.expanduser('~'))
  • 我没有看到将 api 值存储在环境变量中的任何优势,事实上恰恰相反。
  • 我同意@PedroLobito 的观点,即本地隐藏文件是一个很好的第一次剪切,但请确保仅由您的用户将其设为 RW。只需在 linux 机器上执行ls -l ~/.ssh,您可能会在那里看到您的私有 ssh 密钥。如果这把用户吓坏了(我吓坏了),那么需要 selinux 或 apparmour 或其他一些操作系统级别的保护。

标签: python setup.py pypi python-packaging


【解决方案1】:

大多数常见操作系统都有应用程序目录的概念,该目录属于在系统上拥有帐户的每个用户。该目录允许所述用户创建和读取,例如配置文件和设置。

因此,您需要做的就是列出您想要支持的所有发行版,找出他们喜欢放置用户应用程序文件的位置,并拥有一个大的旧 if..elif..else 链来打开相应的目录。


或者使用appdirs,它已经做到了:

from pathlib import Path
import json
import appdirs

CONFIG_DIR = Path(appdirs.user_config_dir(appname='collectiondbf'))  # magic
CONFIG_DIR.mkdir(parents=True, exist_ok=True)

config = CONFIG_DIR / 'config.json'
if not config.exists():
  with config.open('w') as f:
    json.dumps(get_key_from_user(), f)
with config.open('r') as f:
  keys = json.load(f)  # now 'keys' can safely be imported from this module

【讨论】:

  • 哇,谢谢阿恩!这正是我一直在寻找的。我希望它会出现在搜索结果中,供其他人寻找解决方案。
猜你喜欢
  • 2020-06-21
  • 2018-08-14
  • 1970-01-01
  • 1970-01-01
  • 2016-10-28
  • 2013-07-17
  • 1970-01-01
  • 1970-01-01
  • 2022-08-09
相关资源
最近更新 更多