Do Python module imports depend on how the code is run?
我认为任何语言都不会像python那样在导入其他源文件的过程中引起如此简单的问题。所以问题是:我的模块导入是否需要依赖于代码的运行方式?
我有以下目录结构:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | ./__init__.py ./config.py ./kmer ./kmer/__init__.py ./kmer/__main__.py ./kmer/__pycache__ ./kmer/__pycache__/__init__.cpython-36.pyc ./kmer/__pycache__/__main__.cpython-36.pyc ./kmer/__pycache__/bed.cpython-36.pyc ./kmer/__pycache__/config.cpython-36.pyc ./kmer/__pycache__/reference.cpython-36.pyc ./kmer/__pycache__/sets.cpython-36.pyc ./kmer/bed.py ./kmer/config.py ./kmer/reference.py ./kmer/sets.py |
我希望从
所以我在
1 2 3 | import reference import config import sets |
现在,如果我从
再次从
这基本上意味着导入应该取决于代码的运行方式,这毫无意义。我希望能得到一些关于这应该如何工作的解释。
我已经看了很多资源,包括这个问题的答案,虽然非常详细(实际上我发现的最好的描述之一)并不能解决我的问题,也不能提供适当的例子。
更新:我认为这个问题更关注相对导入的不同方面,更准确地说,运行代码的不同方法如何影响导入,而不是它被标记为的副本。所以我首先提到了另一个问题。因此,我认为这不应该是重复的。
编写包时,必须始终将其视为包。首先,这意味着在包中使用相对导入:在
它还意味着如何访问它的答案总是一样的:将包含
不幸的是,在包内运行一个模块作为脚本是一个坏主意:模块的文件仍然有资格以其正确的名称再次导入(而不是第一次使用的
最后,不要太关注python将脚本目录放在