自动调用常用初始化代码,无需创建__init__.py文件

2024-02-20

我的项目中有两个目录:

project/
  src/
  scripts/

“src”包含我精心编写的代码,“scripts”包含一次性的 Python 脚本。

我希望所有脚本都将“../src”添加到其 sys.path 中,以便它们可以访问“src”树下的模块。一种方法是编写一个 script/__init__.py 文件,其内容为:

scripts/__init__.py:
  import sys
  sys.path.append("../src")

这可行,但会产生不必要的副作用,即将我的所有脚本放入名为“scripts”的包中。还有其他方法可以让我的所有脚本自动调用上述初始化代码吗?

我可以只在 .bashrc 中编辑 PYTHONPATH 环境变量,但我希望我的脚本能够开箱即用,而不需要用户摆弄 PYTHONPATH。另外,我不喜欢仅仅为了适应这个项目而进行整个帐户范围的更改。


即使您有其他分发计划,也可能值得整理一个基本的计划setup.py http://docs.python.org/distutils/setupscript.html在你的src文件夹。这样你就可以运行setup.py develop让 distutils 放一个link将您的代码添加到默认路径中(这意味着您所做的任何更改都将就地反映,而无需“重新安装”,并且无论您的脚本位于何处,所有模块都将“正常工作”)。这将是一次性步骤,但这仍然比零多一步,所以这取决于这是否比更新更麻烦.bashrc。如果你使用pip http://pypi.python.org/pypi/pip,等价于pip install -e /path/to/src.

更强大的解决方案(特别是如果您要在多个开发人员的计算机上镜像/版本控制这些脚本)是在受控的虚拟环境中进行开发工作。事实证明 virtualenv 甚至内置了支持进行您自己的引导程序自定义 http://pypi.python.org/pypi/virtualenv/1.6.4#creating-your-own-bootstrap-scripts。看来你只需要一个after_install()挂钩任一调整sitecustomize, run pip install -e,或者添加一个普通的.pth文件到站点包。自定义引导程序可以与其他脚本一起存在于源代码管理中,并且需要为每个开发人员的设置运行一次。您还可以获得使用 virtualenv 的正常好处(显式依赖版本控制、与系统范围配置的隔离以及不同计算机之间的标准化等)。

If you really不想进行任何设置步骤并且愿意only从“project”目录中运行这些脚本,然后你可以扑通一声__init__.py像这样:

project/
    src/
        some_module.py
    scripts/
        __init__.py # special "magic"
        some_script.py

您的文件可能如下所示:

# file: project/src/some_module.py
print("importing %r" % __name__)

def some_function():
    print("called some_function() inside %s" % __name__)
--------------------------------------------------------
# file: project/scripts/some_script.py
import some_module

if __name__ == '__main__':
    some_module.some_function()
--------------------------------------------------------
# file: project/scripts/__init__.py
import sys
from os.path import dirname, abspath, join

print("doing magic!")
sys.path.insert(0, join(dirname(dirname(abspath(__file__))), 'src'))

然后你必须像这样运行你的脚本:

[~/project] $ python -m scripts.some_script
doing magic!
importing 'some_module'
called some_function() inside some_module

谨防!脚本可以only从内部这样称呼project/:

[~/otherdir] $ python -m scripts.some_script
ImportError: no module named scripts

要启用此功能,您需要返回编辑.bashrc,或使用上述选项之一。最后一个选择确实应该是最后的手段;正如@Simon 所说,那时你真的在与语言作斗争。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

自动调用常用初始化代码,无需创建__init__.py文件 的相关文章

随机推荐

  • 将数据块读入matlab数组

    我有一个如下所示的数据文件 3 1 0 1 4 1 7 2 1 2 1 5 1 1 1 2 1 1 1 2 对于每一行 第一个整数表示该行中浮点数的数量 现在我想将所有数据加载到一个matlab数组中 并忽略第一列 也就是说 我想得到一个像
  • 原则:多个(whereIn OR whereIn)查询?

    我在用 Doctrine 编写一个相当简单的查询时遇到了麻烦 我有两个数组 countries cities 我需要检查数据库记录值是否与其中的任何一个匹配 我正在寻找类似的东西 gt whereIn country city countr
  • 当文件在其他进程中使用时删除该文件

    In DocumentViewerControl在 WPF 中 我想在关闭事件处理程序中关闭控件后删除该文件 我试图删除它 但 VS 告诉我它被另一个进程使用 我怎样才能删除它 TextBlock tb TextBlock e TabIte
  • Akka设计原则

    在开发一个相当大的 Akka 应用程序时 我在使用普通方法和非 Akka 类时遇到了一个非常简单的结构 但在使用 Akka 时实际上很难确定 这就是为什么我来这里问你什么建议是解决此问题的最佳方法 所以问题是这样的 我有一个父角色 我们称他
  • 在没有 Adob​​e Reader 的情况下将 pdf 文件显示到浏览器中

    我需要在没有 Adob e Reader 的情况下在浏览器中打开 pdf 文件 是否有 PHP 的 API 可以在浏览器中打开 PDF 文件 Regards No PHP 在服务器上运行 它可以访问的唯一 浏览器 API 是 HTTP 如果
  • 如何在非 root 运行的容器中安装新包?

    我需要在正在运行的容器中安装简单的包 例如curl 但我遇到了这个错误 apk add curl ERROR Unable to lock database Permission denied ERROR Failed to open ap
  • 将 System.out 和 System.err 重定向到 slf4j

    我需要重定向System out err println输出到 slf4j 我知道这不是正确进行日志记录的方法但有一个外部库 它记录到System out 您可以使用slf4j 上的系统输出 http projects lidalia or
  • 否定打字稿类型?

    我想在打字稿中创建一个简单的 NOT 运算符 您可以将所有基元组合到某种类型 A 的联合中 这些基元不是第二种类型 B 的联合的基元成员 这可以使用条件类型来完成 例如 如果您有类型 type A a b c type B c d e 然后
  • 如何从 ByteBuffer 获取短[]

    我在 Android 项目中使用 JNI 代码 其中 JNI 本机函数需要一个短 参数 但是 原始数据存储为 ByteBuffer 我正在尝试按如下方式转换数据格式 ByteBuffer rgbBuf ByteBuffer allocate
  • 同一库的多个版本

    我有项目 A 它曾经有模块 A1 使用 dagger v 1 2 2 现在我想添加到项目 A 模块 A2 它依赖于 dagger v 2 0 但我不能 因为这两个匕首库是冲突的 我可以在不同的 android 模块中以某种方式处理多个版本的
  • 使用 Ruby 正则表达式使用常规双引号转义 '“'

    我的文本包含这些奇特的双引号 我想使用 Ruby gsub 和正则表达式将它们替换为常规双引号 这是一个例子以及我到目前为止所拥有的 sentence This is a quote Hey guys I couldn t figure o
  • (Android Xamarin) 获取资源字符串值而不是 int

    我刚刚开始使用 VS2012 使用 Xamarin 创建一个简单的 Android 应用程序 我知道有一种类型的资源仅用于字符串 在我的资源文件夹中 我有一个如下所示的 xml 文件
  • 当启用面板向左滚动时,如何显示我的页面在左侧部分可见?

    IN this link http view jquerymobile com 1 3 2 dist demos widgets panels 我可以发现有一个覆盖选项 我可以在其中隐藏或显示右侧或左侧的面板 但我想在面板中显示面板 90
  • 在没有 .kv 文件的情况下使用屏幕管理器时出现一些问题

    我正在尝试使用 Pthon 和 kivy 制作应用程序 我正在研究其中的登录 注册部分 我试图为每个屏幕 登录和注册 创建一个屏幕 并将它们与 ScreenManager 连接 但没有 kv 文件 如果不可能 我想在 hte kv 文件中写
  • 如何在 emberjs 上使用单向绑定?

    我开始使用 ember 但我无法理解的一件事是如何使用单向绑定 请考虑以下代码 HTML JS var App Ember Application create Ap
  • 如何在 ASP.NET MVC 中获取其他用户的个人资料?

    我想在用户登录时设置带有时区的 cookie AccountController LogOn 似乎是执行此操作的最佳位置 但是 我还无法在那里读取用户的个人资料 因为我猜您只有在该方法完成时才能访问个人资料 因此 此代码返回一个空字符串 D
  • 如何使用pandas/python处理excel文件头

    我正在尝试阅读https www whatdotheyknow com request 193811 response 480664 attach 3 GCSE 20IGCSE 20results 20v3 xlsx https www w
  • C、C++ 和 Java 中的提升/重新排序:变量声明必须始终位于上下文的顶部吗?

    我读了一些关于提升和重新排序 https stackoverflow com questions 11430095 are hoisting and reordering the same thing 所以看来Java VM可能会选择提升一
  • 从 csv 文件中以嵌套字典格式分别计算男性和女性

    这段代码运行良好 并且以这种格式打印结果 我需要像这样的嵌套字典格式的结果 data year male Q1 1 Q2 1 Q3 1 Q4 1 female Q1 1 Q2 1 Q3 1 Q4 1 代码 import csv result
  • 自动调用常用初始化代码,无需创建__init__.py文件

    我的项目中有两个目录 project src scripts src 包含我精心编写的代码 scripts 包含一次性的 Python 脚本 我希望所有脚本都将 src 添加到其 sys path 中 以便它们可以访问 src 树下的模块