我尝试了一些不同的技术试图做一些对我来说似乎可行的事情,但我想我错过了一些关于python的问题(使用2.7但是如果可能的话,我希望这也能用于3. *)。
我不确定包装或模块这样的术语,但对我而言,以下内容似乎非常简单"可行的情景。
这是目录结构:
.
├── job
│ └── the_script.py
└── modules
├── __init__.py
└── print_module.py
the_script.py
的内容:
# this does not work
import importlib
print_module = importlib.import_module('.print_module', '..modules')
# this also does not work
from ..modules import print_module
print_module.do_stuff()
print_module
的内容:
def do_stuff():
print("This should be in stdout")
我想运行所有这些"相对路径"东西:
/job$ python2 the_script.py
但是importlib.import_module
会出现各种错误:
..modules.print_module
,那么我得到:TypeError("relative imports require the 'package' argument")
ValueError: Empty module name
另一方面,我使用from ..modules
语法得到:ValueError: Attempted relative import in non-package
。
我认为__init__.py
空文件应足以将该代码限定为" packages" (或模块?不确定术语),但似乎有一些关于如何管理相对路径的遗漏。
我读到过去,人们使用path
以及import os
和import sys
中的其他函数来攻击它,但根据官方文档(python 2.7和3. *)这不再需要了。
我做错了什么,怎样才能实现打印内容modules/print_module.do_stuff
从#34;相对目录"中的脚本调用它的结果。 job/
?
答案 0 :(得分:2)
如果您在此处遵循本指南的结构:http://docs.python-guide.org/en/latest/writing/structure/#test-suite(强烈建议您阅读所有内容,这非常有帮助)您会看到:
要为各个测试导入上下文,请创建tests / context.py文件:
import os import sys sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), '..'))) import sample
然后,在各个测试模块中,导入模块,如下所示:
from .context import sample
无论安装方法如何,这都将按预期工作。
在您的情况下翻译,这意味着:
root_folder
├── job
│ ├── context.py <- create this file
│ └── the_script.py
└── modules
├── __init__.py
└── print_module.py
在context.py
文件中写下上面显示的行,但import modules
代替import samples
最后在您的the_script.py
:from .context import module
中,您将开始行动!
答案 1 :(得分:2)
如果您对术语不确定,请转到非常好的教程:
http://docs.python-guide.org/en/latest/writing/structure/#modules
和
http://docs.python-guide.org/en/latest/writing/structure/#packages
但是对于你的结构:
.
├── job
│ └── the_script.py
└── modules
├── __init__.py
└── print_module.py
在the_script.py
:
import sys
sys.append('..')
import modules.print_module
这会将父目录添加到PYTHONPATH,而python会看到目录&#39; parallel&#39;到工作目录,它会工作。
我认为在最基本的层面上,知道这一点是足够的:
__init__.py
文件.py
的文件,但在导入模块时,省略了扩展名。答案 2 :(得分:1)
我找到了使用sys
和os
的解决方案。
脚本the_script.py
应为:
import sys
import os
lib_path = os.path.abspath(os.path.join(os.path.dirname(__file__), '../modules'))
sys.path.append(lib_path)
# commenting out the following shows the `modules` directory in the path
# print(sys.path)
import print_module
print_module.do_stuff()
然后我可以通过命令行运行它,无论我在路径中的哪个位置,例如:
/job$ python2 the_script.py
<...>/job$ python2 <...>/job/the_script.py