Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何使用setuptools附带的静态文件?_Python_Setuptools - Fatal编程技术网

Python 如何使用setuptools附带的静态文件?

Python 如何使用setuptools附带的静态文件?,python,setuptools,Python,Setuptools,我想在本地安装另一个项目中一个项目的包。我能够安装软件包并导入我想要调用的函数。该函数加载一个pickle文件。当我调用该函数时,它会失败,并出现FileNoutFoundError 我遵循并使用了include\u package\u data=True和MANIFEST.in,但这并不能解决我的错误 我有一个简单的项目,结构如下: . ├── example_pkg │   ├── foobar.py │   ├── __init__.py │   └── pickle_files │  

我想在本地安装另一个项目中一个项目的包。我能够安装软件包并导入我想要调用的函数。该函数加载一个pickle文件。当我调用该函数时,它会失败,并出现
FileNoutFoundError

我遵循并使用了
include\u package\u data=True
MANIFEST.in
,但这并不能解决我的错误

我有一个简单的项目,结构如下:

.
├── example_pkg
│   ├── foobar.py
│   ├── __init__.py
│   └── pickle_files
│       └── test.p
├── MANIFEST.in
├── __pycache__
└── setup.py
import setuptools

setuptools.setup(
    name="example-pkg-foo",
    version="0.0.1",
    packages=setuptools.find_packages(),
    include_package_data=True,
)
清单。在
内容中:

include example_pkg/pickle_files/*
foobar.py

import os
import pickle


def out():
    with open(os.path.join("pickle_files", "test.p"), "wb") as f:
        pickle.dump({"hello": "world"}, f)


def f_in():
    with open(os.path.join("pickle_files", "test.p"), "rb") as f:
        d = pickle.load(f)
    print(d["hello"])
test.p
是通过调用
out()
创建的。我不想在另一个项目中安装包后调用它来再次创建文件,它只是在这里演示文件的来源

setup.py
如下所示:

.
├── example_pkg
│   ├── foobar.py
│   ├── __init__.py
│   └── pickle_files
│       └── test.p
├── MANIFEST.in
├── __pycache__
└── setup.py
import setuptools

setuptools.setup(
    name="example-pkg-foo",
    version="0.0.1",
    packages=setuptools.find_packages(),
    include_package_data=True,
)
init.py
为空

然后运行
python setup.py sdist
,创建一个文件夹
dist
,其中包含一个文件
example-pkg-foo-0.0.1.tar.gz
。当我手动检查这个tarball时,我可以看到
example\u pkg/pickle\u files/test.p
存在

---这条线以上的所有内容都是项目A的一部分。下面的所有内容都是项目B的一部分---

然后,我将tarball复制并粘贴到我的另一个项目(项目B)并运行
pip安装示例*
。然后将包安装到我的项目(project B)的虚拟环境中

然后,我使用project B的虚拟环境运行以下脚本:

from example_pkg.foobar import f_in

f_in()
我可以导入包并调用函数。然而,它失败了

Traceback (most recent call last):
  File "/home/madjura/PycharmProjects/package_experiment/foo.py", line 3, in <module>
    f_in()
  File "/home/madjura/PycharmProjects/package_experiment/venv/lib/python3.7/site-packages/example_pkg/foobar.py", line 11, in f_in
    with open(os.path.join("pickle_files", "test.p"), "rb") as f:
FileNotFoundError: [Errno 2] No such file or directory: 'pickle_files/test.p'
回溯(最近一次呼叫最后一次):
文件“/home/madjura/PycharmProjects/package_-experience/foo.py”,第3行,在
f_in()
文件“/home/madjura/PycharmProjects/package_experience/venv/lib/python3.7/site packages/example_pkg/foobar.py”,第11行,f_in
将open(os.path.join(“pickle_文件”、“test.p”)、“rb”)作为f:
FileNotFoundError:[Errno 2]没有这样的文件或目录:“pickle\u files/test.p”
当我检查(项目B的)venv时,我可以看到该文件包含在安装中:

.
└── site-packages
    ├── example_pkg
    │   ├── foobar.py
    │   ├── __init__.py
    │   ├── pickle_files
    │   │   └── test.p  <------ it is included in the venv
    │   └── __pycache__
    │       ├── foobar.cpython-37.pyc
    │       └── __init__.cpython-37.pyc
    └── example_pkg_foo-0.0.1-py3.7.egg-info
        ├── dependency_links.txt
        ├── installed-files.txt
        ├── PKG-INFO
        ├── SOURCES.txt
        └── top_level.txt
。
└── 网站包
├── 示例_包装
│   ├── foobar.py
│   ├── __初始值
│   ├── pickle_文件

│   │   └── test.p将
foobar.py
更改为:

导入操作系统
进口泡菜
def out():
将open(os.path.join(os.path.dirname(_文件)、“pickle_文件”、“test.p”)、“wb”)作为f:
pickle.dump({“hello”:“world”},f)
定义f_in():
将open(os.path.join(os.path.dirname(_文件)、“pickle_文件”、“test.p”)、“rb”)作为f:
d=酸洗负荷(f)
打印(d[“hello”])
当您从其他地方启动它时,解码路径的起点不同