如何使用 setuptools 中包含的静态文件?
How to use static files included with setuptools?
我想将一个项目的包本地安装到另一个项目中。我能够安装包并导入我想调用的函数。该函数加载一个 pickle 文件。当我调用该函数时,它失败并显示 FileNoutFoundError
.
我遵循了 this answer 并使用了 include_package_data=True
和 MANIFEST.in
但这并没有解决我的错误。
我有一个简单的项目,结构如下:
.
├── example_pkg
│ ├── foobar.py
│ ├── __init__.py
│ └── pickle_files
│ └── test.p
├── MANIFEST.in
├── __pycache__
└── setup.py
MANIFEST.in
内容:
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
看起来像这样:
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_pkg/pickle_files/test.p
存在。
--- 此行以上的所有内容都是项目 A 的一部分。下面的所有内容都是项目 B 的一部分。 ---
然后我将 tarball 复制并粘贴到我的其他项目(项目 B)和 运行 pip install example*
。然后该包安装在我的项目(项目 B)的虚拟环境中。
然后我运行以下脚本使用项目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'
当我检查(项目 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
我的Python版本是3.7.3。我想在另一个项目中本地安装一个带有 pickle 文件的包,而不创建新的 pickle 文件。我想使用已经存在的那个。我如何在调用 f_in()
时修复 FileNotFoundError
?
将foobar.py
更改为:
import os
import pickle
def out():
with open(os.path.join(os.path.dirname(__file__), "pickle_files", "test.p"), "wb") as f:
pickle.dump({"hello": "world"}, f)
def f_in():
with open(os.path.join(os.path.dirname(__file__), "pickle_files", "test.p"), "rb") as f:
d = pickle.load(f)
print(d["hello"])
当你从其他地方启动它时,你有不同的解码路径起点。
我想将一个项目的包本地安装到另一个项目中。我能够安装包并导入我想调用的函数。该函数加载一个 pickle 文件。当我调用该函数时,它失败并显示 FileNoutFoundError
.
我遵循了 this answer 并使用了 include_package_data=True
和 MANIFEST.in
但这并没有解决我的错误。
我有一个简单的项目,结构如下:
.
├── example_pkg
│ ├── foobar.py
│ ├── __init__.py
│ └── pickle_files
│ └── test.p
├── MANIFEST.in
├── __pycache__
└── setup.py
MANIFEST.in
内容:
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
看起来像这样:
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_pkg/pickle_files/test.p
存在。
--- 此行以上的所有内容都是项目 A 的一部分。下面的所有内容都是项目 B 的一部分。 ---
然后我将 tarball 复制并粘贴到我的其他项目(项目 B)和 运行 pip install example*
。然后该包安装在我的项目(项目 B)的虚拟环境中。
然后我运行以下脚本使用项目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'
当我检查(项目 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
我的Python版本是3.7.3。我想在另一个项目中本地安装一个带有 pickle 文件的包,而不创建新的 pickle 文件。我想使用已经存在的那个。我如何在调用 f_in()
时修复 FileNotFoundError
?
将foobar.py
更改为:
import os
import pickle
def out():
with open(os.path.join(os.path.dirname(__file__), "pickle_files", "test.p"), "wb") as f:
pickle.dump({"hello": "world"}, f)
def f_in():
with open(os.path.join(os.path.dirname(__file__), "pickle_files", "test.p"), "rb") as f:
d = pickle.load(f)
print(d["hello"])
当你从其他地方启动它时,你有不同的解码路径起点。