如何从__main__.py访问__init__.py中的符号?

时间:2019-05-30 09:04:29

标签: python python-import

我有一个模块-我们称之为let x = "Categories=All&Search=hat&ListPage=15&Page=1"; const res = x.split("&", 2).map(e => e + "&").join(""); console.log(res);-我想通过foo调用使其可用。我的程序如下:

python -m foo

my_project ├── foo │   └── __init__.py └── my_program.py 中,有一些我在调用__init__.py时运行的代码:

python -m foo

由于我现在在def bar(name): print(name) # -- code used to 'run' the module def main(name): bar("fritz") if __name__ == "__main__": main() 中有大量执行代码(__init__.py内容和一些逻辑),我想将其分成argparse

__main__.py

尽管对我来说看起来很简单,但我仍无法从my_project ├── foo │   ├── __init__.py │   └── __main__.py └── my_program.py 导入__init__.py中的内容。

我知道-如果__main__.py位于foo或可以通过site-packages访问,我可以PYTHONPATH ..

但是,如果我想执行 import foo直接 (例如从某些IDE),而__main__.py位于任何地方(即不是Python查找软件包的文件夹)-是否可以导入foo(从同一目录中的foo)?

我尝试了__init__.pyimport .-但两种方法都失败了(因为它们当然意味着其他意思)

可以做的(至少可以解释我的目标)是这样的:

import foo

可以,但是很丑陋,并且有点危险,因为我什至不知道我是否真的从同一目录导入sys.path.append(os.path.join(os.path.dirname(__file__), "..")) import foo

1 个答案:

答案 0 :(得分:0)

您可以手动设置module import state,就像用__main__.py执行-m一样:

# foo/__main__.py
import os
import sys
if __package__ is None and __name__ == "__main__":  # executed without -m
   # set special attributes as if part of the package
   __file__ = os.path.abspath(__file__)
   __package__ = os.path.basename(os.path.dirname(__file__))
   # replace import path for __main__ with path for package
   main_path = os.path.dirname(__file__)
   try:
       index = sys.path.index(dir_path)
       if index != 0 or index != 1:
           raise ValueError('expected script directory after current directory or matching it')
   except ValueError:
       raise RuntimeError('sys.path does not include script directory as expected')
   else:
       sys.path[index] = main_path
# import regularly
from . import bar

这利用了python3 path/to/foo/__main__.py作为独立脚本执行__main__的情况:__package__None,而__name__也不包含包。在这种情况下,搜索路径为<current directory>, <__main__ directory>, ...,尽管如果两者相同,则搜索路径会折叠:index为0或1。

与内部所有欺骗一样,存在一些违反不变式的瞬时状态。在修补模块之前,请勿执行任何导入操作!