python中的相对模块路径-如何配置路径(和PyCharm)
我正在使用PyCharm(在Windows机器上)编写python 3.7脚本。该脚本由同事编写,并已在多台计算机上运行。我不想对文件结构或脚本进行任何更改(我稍后将进行的算法更改除外),因此可以将其合并回原始repo。python中的相对模块路径-如何配置路径(和PyCharm),python,module,path,pycharm,Python,Module,Path,Pycharm,我正在使用PyCharm(在Windows机器上)编写python 3.7脚本。该脚本由同事编写,并已在多台计算机上运行。我不想对文件结构或脚本进行任何更改(我稍后将进行的算法更改除外),因此可以将其合并回原始repo。 但是,相对路径存在一个问题。我希望我可以通过改变我机器上的配置来解决这个问题 我把同事的github回购分成C:\Users…\project 我正在使用的脚本是C:\Users…\project\…\model\script.py 除了script.py,目录(源目录)C:\
但是,相对路径存在一个问题。我希望我可以通过改变我机器上的配置来解决这个问题 我把同事的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
包含一个空的\uuuu init\uuuuu.py
文件,并且在PyCharm中,C:\Users…\project\…\model
标记为库根
python解释器位于C:\Users…\Local\Continuum\anaconda3\python.exe
,(我认为这使得C:\Users…\Local\Continuum\anaconda3
成为根目录?)源目录不是根目录的子路径
script.py
包含来自..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中或从命令行运行。请帮忙 要运行此脚本,您需要在模型
上至少有一个以上的包级别。具有以下文件结构:
.
└── parent_pkg
├── __init__.py
└── model
├── __init__.py
├── module1.py
└── script.py
这些文件包括:
模块1.py
script.py
以下命令允许您运行此脚本:
$ python -m parent_pkg.model.script
Hi there
请注意,您需要在parent\u-pkg
的父目录中运行此命令,否则Python将无法找到parent\u-pkg
。在当前示例中,我从
目录运行脚本(遵循树结构)
您也可以指定此模块在PyCharm中运行,但您可能需要指定parent\u pkg
的父目录作为工作目录:
谢谢@awesoon OK:上面的文件夹model
是modeling
,它包含一个空的\uuuu init\uuuuuuuuuy.py
,因此结构如您所建议。但是,当按照您的建议运行时,从PyCharm,我得到无法打开文件'modeling.model.script':[Errno 2]没有这样的文件或目录
,从命令行我得到'ModuleNotFoundError:没有名为'modeling'的模块@doctorer您确定该文件名为\u innit\uu
(双n)?因为它应该是\uuuu init\uuuuu
(单个n),所以也请确保从建模
上方的目录运行此脚本,否则python将无法在当前目录中找到建模
。modeling
上面的目录可能是一个普通目录,即没有\uuu init\uuuu.py
@doctorer如果您在modeling
上面有其他目录,我想您也需要将它们包括在模块路径中。或者,您可以尝试更改工作目录
@doctor。您不必将-m
添加到解释器选项中,因为PyCharm已经允许在文件/模块执行之间切换。请参见第一行的“模块名称”下拉列表
from ..model.module1 import Class1
if __name__ == '__main__':
c = Class1()
print('Hi there')
$ python -m parent_pkg.model.script
Hi there