繁体   English   中英

我如何使用 package 非代码数据 python setup.py

[英]How do I package non-code data with python setup.py

我有一个具有以下结构的 python 项目

my-project
   venv
   tests
   setup.py
   abc
      __init__.py
      my_pckg
         __init__.py
         foo.py
      static
         data_0.txt
         sub_dir1
             data_1.yaml
         sub_dir2
             data_2.csv
             another file with space in name.pdf
   

假设在abc/foo.py我有

#abc/foo.py
import os
import yaml
with open(os.path.join("abc", "static", "sub_dir1", "data_1.yaml"), "r") as f:
  content= yaml.safe_load(stream)

if __name__ == "__main__":
  print(content)

方法 1:如果我在my-project目录中打开 python 控制台,它会按预期工作

from abc.my_pckg.foo import content
...

方法 2:如果我运行,它也能按预期工作

python abc/foo.py

方法 3:现在我想 package 使用 setup.py 文件的代码如下

import setuptools
import os


def package_files(directory):
    paths = []
    for (path, directories, filenames) in os.walk(directory):
        for filename in filenames:
            paths.append(os.path.join('..', path, filename))
    return paths


extra_files = package_files('abc/static')

setuptools.setup(
    name="some-name",
    version="0.1.0",
    package_dir={"abc": "abc"},
    include_package_data=True,
    package_data={'': extra_files},
    packages=[
        "abc",
        "bma.my_pckg",
    ],
    python_requires=">=3.6",
    install_requires=[],
)

然后我通过python setup.py bdist_wheel --dist=dist生成 whl 文件

然后将 whl 文件移动到我希望安装的位置并运行pip install...来安装它

new-project
  venv

但是,当我尝试这样做时,出现此错误

  File "abs-path-to-new-poject\venv\lib\site-packages\abc\my_pckg\foo.py", line , in <module>
    with open(os.path.join("abc", "static", "sub_dir1", "data_1.txt"), "r") as f:
  FileNotFoundError: [Errno 2] No such file or directory: 'abc\\static\\data_1.yaml'\

我该如何解决? 我应该如何将package static数据与python?

我希望能够使用上面的三种方法来运行代码

注意:安装后,我在venv/Lib/site_packages/static下有所有文件问题是我在foo.py中的代码

以及如何处理another file with space in name.pdf

注意:我正在使用这里建议的方法https://stackoverflow.com/a/36693250/11065874

进一步阅读:

我通过将代码更改为解决了我的问题

#abc/foo.py
import os
import yaml


_path = os.path.join(Path(__file__).parent.parent, "static", "sub_dir1", "data_1.yaml")

with open(_path, "r") as stream:
    content= yaml.safe_load(stream)


if __name__ == "__main__":
  print(content)

我相信您正在寻找设置工具的data_files选项。

data_files 选项可用于指定模块分发所需的附加文件:配置文件、消息目录、数据文件,以及任何不属于前面类别的文件。 data_files 以下列方式指定一系列(目录、文件)对:

 setup(..., data_files=[('bitmaps', ['bm/b1.gif', 'bm/b2.gif']), ('config', ['cfg/data.cfg'])], )

序列中的每个 (directory, files) 对指定安装目录和要安装在那里的文件。 files 中的每个文件名都相对于 setup.py 脚本进行解释。

有关设置工具的许多不同关键字 arguments 的更多信息,请参阅此答案

data_files选项的文档在这里

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM