如何正确分发带有数据文件的 pip 包?

2024-01-07

我有一个要分发的包:

mymodule/
    data/
        1.txt
    mymodule/
        __init__.py
    tests/
        test_mymodule.py
    setup.py

为了将其安装在 virtualenv 下,我应用以下命令:

pip install .

一切都安装正常,但我的数据文件的路径损坏了。

>>> from mymodule import get
>>> print(get())
...
FileNotFoundError: [Errno 2] No such file or directory: '/home/alexander/Stuff/pip_example/mymodule_test/venv/lib/python3.5/site-packages/mymodule/../data/1.txt'

我进行了研究,发现该文件夹data是在导致错误的 virtualenvs 文件夹的根目录中创建的。我应该如何改进我的代码以保持测试正常运行并拥有数据文件的正确路径?

文件内容:

数据/1.txt

yes

mymodule/__init__.py

import os

src = os.path.join(
    os.path.dirname(__file__),
    '../data/1.txt'
)

def get():
    with open(src) as f:
        return f.read().strip()

测试/test_mymodule.py

import unittest
import mymodule

class MymoduleTest(unittest.TestCase):
    def test_get(self):
        s = mymodule.get()
        self.assertEqual(s, "yes")

setup.py

from distutils.core import setup

data_files = [
    ('data', ['data/1.txt'])
]

setup(
    name='mymodule',
    version='0.0',
    packages=['mymodule'],
    data_files=data_files,
)

我是包装 Python 模块的新手。请帮我解决这个问题。

=================================================== ===================

我发现我需要使用sys.prefix访问 virtualenv 的根目录。换句话说,如果我编辑mymodule.__init__.py这样一切都会正常工作:

import os
import sys

src = os.path.join(sys.prefix, 'data/1.txt')

def get():
    with open(src) as f:
        return f.read().strip()

但之后测试失败并出现错误:

FileNotFoundError: [Errno 2] No such file or directory: '/usr/data/1.txt'

这是因为sys.prefix is /usr没有激活 virtualenv。所以我想我需要一种不同的方式来改进这个包。


  1. 安装软件包时检查您的文件是否已正确分发。

  2. sys.prefix不会找到“你的”包裹。这__file__模块的属性指向__init__.py文件。您可以将其用作基本路径,如下所示:

    import os
    import mymodule
    
    src = os.path.join(os.dirname(mymodule.__file__), 'data/1.txt')
    
    def get():
        with open(src) as f:
            return f.read().strip()
    
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何正确分发带有数据文件的 pip 包? 的相关文章

  • 没有名为 crypto.cipher 的模块

    我现在正在尝试加密一段时间 我最近得到了这个基于 python 的密码器 名为PythonCrypter https github com jbertman PythonCrypter 我对 Python 相当陌生 当我尝试通过终端打开 C
  • 将 Matplotlib 误差线放置在不位于条形中心的位置

    我正在 Matplotlib 中生成带有错误栏的堆积条形图 不幸的是 某些层相对较小且数据多样 因此多个层的错误条可能重叠 从而使它们难以或无法读取 Example 有没有办法设置每个误差条的位置 即沿 x 轴移动它 以便重叠的线显示在彼此
  • Flask 会话变量

    我正在用 Flask 编写一个小型网络应用程序 当两个用户 在同一网络下 尝试使用应用程序时 我遇到会话变量问题 这是代码 import os from flask import Flask request render template
  • 如何从网页中嵌入的 Tableau 图表中抓取工具提示值

    我试图弄清楚是否有一种方法以及如何使用 python 从网页中的 Tableau 嵌入图形中抓取工具提示值 以下是当用户将鼠标悬停在条形上时带有工具提示的图表示例 我从要从中抓取的原始网页中获取了此网址 https covid19 colo
  • 是否可以忽略一行的pyright检查?

    我需要忽略一行的pyright 检查 有什么特别的评论吗 def create slog group SLogGroup data Optional dict None SLog insert one SLog group group da
  • 基于代理的模拟:性能问题:Python vs NetLogo & Repast

    我正在 Python 3 中复制一小段 Sugarscape 代理模拟模型 我发现我的代码的性能比 NetLogo 慢约 3 倍 这可能是我的代码的问题 还是Python的固有限制 显然 这只是代码的一个片段 但 Python 却花费了三分
  • Python pickle:腌制对象不等于源对象

    我认为这是预期的行为 但想检查一下 也许找出原因 因为我所做的研究结果是空白 我有一个函数可以提取数据 创建自定义类的新实例 然后将其附加到列表中 该类仅包含变量 然后 我使用协议 2 作为二进制文件将该列表腌制到文件中 稍后我重新运行脚本
  • AWS EMR Spark Python 日志记录

    我正在 AWS EMR 上运行一个非常简单的 Spark 作业 但似乎无法从我的脚本中获取任何日志输出 我尝试过打印到 stderr from pyspark import SparkContext import sys if name m
  • 绘制方程

    我正在尝试创建一个函数 它将绘制我告诉它的任何公式 import numpy as np import matplotlib pyplot as plt def graph formula x range x np array x rang
  • BeautifulSoup 中的嵌套标签 - Python

    我在网站和 stackoverflow 上查看了许多示例 但找不到解决我的问题的通用解决方案 我正在处理一个非常混乱的网站 我想抓取一些数据 标记看起来像这样 table tbody tr tr tr td td td table tr t
  • 使用 \r 并打印一些文本后如何清除控制台中的一行?

    对于我当前的项目 有一些代码很慢并且我无法使其更快 为了获得一些关于已完成 必须完成多少的反馈 我创建了一个进度片段 您可以在下面看到 当你看到最后一行时 sys stdout write r100 80 n I use 80覆盖最终剩余的
  • 如何在Python中对类别进行加权随机抽样

    给定一个元组列表 其中每个元组都包含一个概率和一个项目 我想根据其概率对项目进行采样 例如 给出列表 3 a 4 b 3 c 我想在 40 的时间内对 b 进行采样 在 python 中执行此操作的规范方法是什么 我查看了 random 模
  • 解释 Python 中的数字范围

    在 Pylons Web 应用程序中 我需要获取一个字符串 例如 关于如何做到这一点有什么建议吗 我是 Python 新手 我还没有找到任何可以帮助解决此类问题的东西 该列表将是 1 2 3 45 46 48 49 50 51 77 使用
  • 类型错误:预期单个张量时的张量列表 - 将 const 与 tf.random_normal 一起使用时

    我有以下 TensorFlow 代码 tf constant tf random normal time step batch size 1 1 我正进入 状态TypeError List of Tensors when single Te
  • 如何计算 pandas 数据帧上的连续有序值

    我试图从给定的数据帧中获取连续 0 值的最大计数 其中包含来自 pandas 数据帧的 id date value 列 如下所示 id date value 354 2019 03 01 0 354 2019 03 02 0 354 201
  • 使用其构造函数初始化 OrderedDict 以便保留初始数据的顺序的正确方法?

    初始化有序字典 OD 以使其保留初始数据的顺序的正确方法是什么 from collections import OrderedDict Obviously wrong because regular dict loses order d O
  • Scrapy:如何使用元在方法之间传递项目

    我是 scrapy 和 python 的新手 我试图将 parse quotes 中的项目 item author 传递给下一个解析方法 parse bio 我尝试了 request meta 和 response meta 方法 如 sc
  • 从列表指向字典变量

    假设你有一个清单 a 3 4 1 我想用这些信息来指向字典 b 3 4 1 现在 我需要的是一个常规 看到该值后 在 b 的位置内读写一个值 我不喜欢复制变量 我想直接改变变量b的内容 假设b是一个嵌套字典 你可以这样做 reduce di
  • Python 类继承 - 诡异的动作

    我观察到类继承有一个奇怪的效果 对于我正在处理的项目 我正在创建一个类来充当另一个模块的类的包装器 我正在使用第 3 方 aeidon 模块 用于操作字幕文件 但问题可能不太具体 以下是您通常如何使用该模块 project aeidon P
  • Python Selenium:如何在文本文件中打印网站上的值?

    我正在尝试编写一个脚本 该脚本将从 tulsaspca org 网站获取以下 6 个值并将其打印在 txt 文件中 最终输出应该是 905 4896 7105 23194 1004 42000 放置的动物 的 HTML span class

随机推荐

  • Delphi 2010 中的 SSH 上的 FTP (SFTP)

    我正在编写一个简单的 Delphi 应用程序来将一些文件上传到 SFTP 服务器 我想我可以使用TIdFTPIndy 客户端 但似乎它们不是 FTP over SSH SFTP 的选项 有谁知道 Delphi 2010 的任何免费 开源组件
  • 我想获取 GCP VM 实例的操作系统

    我想要获取 GCP VM 实例的操作系统 目前我只能看到创建实例的图像 有办法得到吗 我看到操作系统库存管理需要在虚拟机上设置一些元数据https cloud google com compute docs instances view o
  • 如何从 Servlet 使用 Facebook Graph-API

    我需要从 J2EE 应用程序 服务器端 访问 Facebook 我首先看了一下这个项目 http code google com p facebook java api http code google com p facebook jav
  • Pug/Jade 中动态包含的解决方法

    据我了解 Pug 不支持模板中的动态包含或扩展 IE extend path to template 有效但无效 extend dynamic path to template 是否有一种解决方法 无论多么复杂 可以实现在运行时修改视图使用
  • 类型“HTMLElement”上不存在属性“checked”。

    我在打字稿文件中有这段代码 function debug show removed flights if debug window show removed flights 0 checked fly schedule removed re
  • 当我事先不知道密钥时,如何在 C# 中解析 JSON 对象?

    我有一些 JSON 数据 如下所示 910719 id 910719 type asdf ref id 7568 910721 id 910721 type asdf ref id 7568 910723 id 910723 type as
  • 如何检查下一个运算符是否可以使用?

    有关任何 Axapta 版本的问题 如何检查 下一个 运算符是否可以与记录一起使用 如何抑制调试器对不可接受的 下一个 运算符 Thanks 重现代码 static void Job13 Args args CustTrans ct1 Cu
  • 如何通过 mysql 中的联接提高 order by 性能

    我正在开发一个社交网络跟踪应用程序 即使是连接也可以通过适当的索引来正常工作 但是当我添加 order by 子句时 总查询的执行时间增加了 100 倍 我使用以下查询来获取没有 order by 子句的 twitter users SEL
  • 通过$.post动态加载内容不保留点击事件

    因此 我正在尝试创建一个 TODO 列表 但是一旦我动态加载内容 我就会遇到 单击 事件的问题 我想要实现的是 一旦我单击一个元素 就通过 post 将 id 发送到 PHP 文件 该文件从我的 MySQL 数据库中删除该行 然后 显示一个
  • 在正则表达式 python 中转义 \s 匹配中的 \n

    我想替换所有空格字符 除了 n with 我尝试使用正则表达式 s 但它也与换行符匹配 有什么方法可以跳过 n in s在正则表达式中 如果您不必考虑 Unicode 您可以使用 t r f v 或者 自从 v匹配 VT 垂直符号 x0b
  • node-mongodb-native:如何通过我的应用程序共享连接回调的 db api 对象

    我目前正在从 mongoose 回滚到 node mongodb native 所以我对这个话题很陌生 然而 我目前的问题是想要在服务器启动时创建一个数据库集合 然后我可以通过应用程序使用它 不幸的是 我只在存储库中找到了示例 您只能在连接
  • 尝试重新加载 module.pm 已中止。编译失败

    我有一个正在执行的 Perl 脚本mod perl并作为HTTP server myServer pl uses a module pm 当我与一位用户一起使用时 一切看起来都很好 但是当我将它置于数百个用户的压力下时 它给了我这个奇怪的错
  • QWidget 报告错误的宽度值

    我想查询小部件的宽度以执行一些自定义布局管理 不幸的是 无论小部件实际有多大或多小 以下代码都会返回 640 int myWidth this gt rect size width this is my class derived from
  • 为什么 video.requestPictureInPicture() 只能运行一次?

    我正在尝试通过 Javascript onscroll 函数进入和退出视频的 PIP 模式 并且我只能进入和退出此模式一次 这是我的代码笔 if myVideo paused myVideo currentTime gt 0 myVideo
  • PHP 从数字字符串中删除逗号

    在 PHP 中 我有一个全是字符串的变量数组 一些存储的值是带有逗号的数字字符串 我需要的 一种从字符串中修剪逗号的方法 并且仅对数字字符串执行此操作 这并不像看起来那么简单 主要原因是以下几点失败 a 1 435 if is numeri
  • Git Gui 不会忽略提交消息中以井号 (#) 开头的行

    当我使用git commit 以井号 开头的行将被忽略 但当我使用 Git Gui 提交时 它们不会被忽略 如同使用井号 开始 git 提交消息 https stackoverflow com questions 2788092 start
  • 使用模板的 Docusign 嵌入式签名

    我需要步骤 程序让收件人使用模板通过 NodeJS 应用程序进行签名 目前我正在使用 docusign 节点 sdk 我想通过 API 将签名嵌入到应用程序中 嵌入式签名 而不是在另一个窗口中打开 DocuSign 我建议你看一下DocuS
  • Android Vimeo 视频在 webview 中第二次播放时崩溃

    我在webview中播放vimeo视频 源代码你可以看一下 Android Vimeo 视频无法在 webview 中播放 https stackoverflow com questions 25130801 android vimeo v
  • MadExcept 在尝试最后时触发

    我正在使用 MadExcept 来调试我的应用程序 这是一个优秀的框架 但当 try finally 块发生异常时 它仍然显示那个丑陋的框 并且用户认为应用程序已经崩溃 我怎样才能删除它 有办法吗 听起来好像它正在按设计工作 try fin
  • 如何正确分发带有数据文件的 pip 包?

    我有一个要分发的包 mymodule data 1 txt mymodule init py tests test mymodule py setup py 为了将其安装在 virtualenv 下 我应用以下命令 pip install