【问题标题】:python module resides in a repository whose name contains dash characterspython 模块位于名称包含短划线字符的存储库中
【发布时间】:2012-07-24 05:23:27
【问题描述】:

我知道模块的名称不应该有破折号。

这是我的存储库结构

my-repo-name/
     src/ 
     tests/
        __init__.py
        tests.py
     fab/
        __init__.py
        fabfile.py

     README.rst
     __init__.py

在我的测试中,我需要导入 fabfile.py 来运行测试。但是因为名字有破折号,我不能做from my-module-name.fab.fabfile import X,Y,Z或相对导入,因为它是一个非包。

任何建议如何在不使用__import__(...) 破解或将其添加到系统路径的情况下执行此操作?我应该添加另一个目录吗?

【问题讨论】:

  • 我认为更改你的 repo 的名称可能是你最好的选择,因为你不能在 python 中使用名称中的破折号来做任何事情。第二个最佳选择是以不同(可导入)名称创建指向该目录的符号链接。
  • 谢谢.. 但我见过有人使用名称中带有破折号的存储库。符号链接...我想过,但hg 是硬链接。也许问题更多的是关于如何构建我的回购协议,以便它实际上不会从 my-repo-name 导入?谢谢。
  • 一个存储库,当然。大多数时候,repo 不是模块/包,它是模块/包目录的容器......并且名称中不能有破折号。
  • 只需再创建一级目录。 my-repo-name -> myproject -> __init__.py, src, tests, ...

标签: python package


【解决方案1】:

使用importlib.import module:

import importlib
fabfile = importlib.import_module('my-repo-name.fab.fabfile', None)
X = fabfile.X

但是您真的应该只更改存储库的名称。要转换,您可以使用

创建一个临时的symlink
$ mv my-repo-name my_repo_name
$ ln -s my_repo_name my-repo-name

【讨论】:

  • 是的。这当然是一种解决方案。谢谢。但我想这个问题更像是如何重组我的回购协议,这样我就不需要重命名它并且仍然能够导入。我也看到有人使用这样的 repo 名称。
  • 我想你想要的是 mv 而不是 my
  • 谢谢大家!我添加了一个额外的目录。但是这个解决方案也很有希望:)
猜你喜欢
  • 2022-10-05
  • 2010-10-19
  • 1970-01-01
  • 1970-01-01
  • 2019-07-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多