![](/img/trans.png)
[英]Custom ansible module in python - How to resolve relative role file paths?
[英]Relative module paths in python - how to configure paths (and PyCharm)
我正在使用 PyCharm(在 Windows 机器上)处理 python 3.7 脚本。 该脚本由同事编写,并已在多台机器上运行。 我不想对文件结构或脚本进行任何更改(我稍后将进行的算法更改除外),因此可以将其合并回原始存储库。
但是,相对路径存在问题。 我希望我可以通过更改我机器上的配置来解决它。
我将同事的 github 存储库分叉到C:\\Users...\\project
我正在处理的脚本是C:\\Users...\\project\\...\\model\\script.py
。
除了script.py
,目录(源目录) C:\\Users...\\project\\...\\model
包含许多模块( module1.py
、 module2.py
等),其中包括类、例如,由script.py
导入的Class
。
C:\\Users...\\project\\...\\model
包含一个空的__init__.py
文件,在 PyCharm 中, C:\\Users...\\project\\...\\model
被标记为library root
。
python 解释器位于C:\\Users...\\Local\\Continuum\\anaconda3\\python.exe
,(我认为这使C:\\Users...\\Local\\Continuum\\anaconda3
成为根目录?)源目录是不是根目录的子路径。
script.py
包含from ..model.module1 import Class1
的行,这是导致问题的原因,但我不想更改该行,因为我认为问题出在我的配置上,而不是出在脚本上。
我的理解是,当我从 PyCharm 中运行script
时,默认情况下, C:\\Users...\\project\\...\\model
被添加到PYTHONPATH
并且工作目录设置为C:\\Users...\\project\\...\\model
。
该过程失败并显示以下消息:
from ..model.module1 import Class1
ValueError: attempted relative import beyond top-level package
据推测,这是因为..
指向工作目录上方的文件夹? 但是,如果我将工作目录更改为更高级别,例如C:\\Users...\\project
,我会收到相同的消息。
我也试过从命令行运行它:
cd C:\Users...\Local\Continuum\anaconda3
python C:\Users...\project\...\model\script.py
生成相同的消息。
一位同事建议使用-m
开关,但是
cd C:\Users...\Local\Continuum\anaconda3
python -m script.py
给出了不同的信息:
from ..model.module1 import Class1
ImportError: attempted relative import with no known parent package
所以,我不确定如何继续,让脚本在 PyCharm 或命令行中运行。 请帮忙!
您需要至少比model
多一个包级别才能运行此脚本。 具有以下文件结构:
.
└── parent_pkg
├── __init__.py
└── model
├── __init__.py
├── module1.py
└── script.py
这些文件内容:
模块1.py
class Class1:
pass
脚本文件
from ..model.module1 import Class1
if __name__ == '__main__':
c = Class1()
print('Hi there')
以下命令允许您运行此脚本:
$ python -m parent_pkg.model.script
Hi there
注意这个命令需要在parent_pkg
的父目录下运行,否则 Python 将无法找到parent_pkg
。 在当前示例中,我从.
目录(遵循树形结构)
并且你也可以指定这个模块在 PyCharm 中运行,但是你可能需要指定parent_pkg
的父目录作为工作目录:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.