我正在使用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
等),其中包括类,例如。 Class
由script.py
导入。
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中运行还是从命令行运行。请帮忙!
答案 0 :(得分:1)
您需要在model
以上至少有一个以上的软件包级别才能运行此脚本。具有以下文件结构:
.
└── parent_pkg
├── __init__.py
└── model
├── __init__.py
├── module1.py
└── script.py
这些文件的内容:
module1.py
class Class1:
pass
script.py
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
的父目录指定为工作目录: