我有一个模块-我们称之为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__.py
和import .
-但两种方法都失败了(因为它们当然意味着其他意思)
我可以做的(至少可以解释我的目标)是这样的:
import foo
可以,但是很丑陋,并且有点危险,因为我什至不知道我是否真的从同一目录导入sys.path.append(os.path.join(os.path.dirname(__file__), ".."))
import foo
。
答案 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。
与内部所有欺骗一样,存在一些违反不变式的瞬时状态。在修补模块之前,请勿执行任何导入操作!