在更大的 PyCharm 或 IntelliJ 项目中是否支持具有自己的 virtualenvs 的子目录?

Within a larger PyCharm or IntelliJ project is there support for subdirectories with their own virtualenvs?

一直在使用 IntelliJ 作为我的 IDE 将包含自己的 infrastructure/deployment 代码的应用程序放在一起。签入 Git 的整个项目包括几个独立的 python 脚本,这些脚本包含在我的项目下的子目录中(包括它们的包信息和支持 python 文件)。我的 IAC/deployment 代码负责确保这些脚本在部署到的基础架构上时具有包含所需包的 virtualenv。所有这些都工作正常,除了当我试图让 IntelliJ 理解 python 子目录环境时。

当我将整个项目树作为 IntelliJ 项目打开时,似乎无法向 IntelliJ 解释某些子目录应该被视为它们自己的 python 项目,这样它们就可以了解自己的 virtualenv、包和基本导入目录。由于 IntelliJ 不理解这些东西,它认为我在这些脚本中的导入是错误的,我不能在代码等中跳转。

作为变通办法,我有时只是将 python 子目录作为它们自己的 IntelliJ 项目打开,以便 IntelliJ 可以理解它们。但这并不理想,因为我必须为同一个更大的项目使用多个不同的 IntelliJ 实例。

所以现在也许我的问题更有意义,我会重申一下。有没有什么方法我可以让 IntelliJ 的一个实例正确理解整个项目,包括一些子目录就像 python 具有自己的虚拟环境和包等的子项目?

一个PyCharm/IntelliJ“项目”可以有“sub-projects”。您可以通过将一个项目“附加”到另一个项目来访问此功能。打开一个项目。然后打开第二个项目。您会看到一个对话框,询问您要如何打开项目,其中一个选项是“附加”。如果你 select 这个选项,第二个项目被添加到已经打开的 window 并且你的 window 现在包含两个有些独立的项目。

如果您现在调出首选项面板,select“项目:xxx -> 项目解释器”,您应该会看到面板中央部分列出了两个项目。您可以 select 每一个,并为每个项目单独配置 interpreter/environment 设置。您还可以以同样的方式为每个 sub-project 独立设置项目结构和项目依赖关系。我相信这就是您要问的操作方法。

为了说明,这里有一张屏幕截图显示了它的样子,这里有三个项目在一个 window/main 项目中管理:

根据上面屏幕截图中的“项目:if-lab”部分标题,PyCharm/IntelliJ 似乎认为其中一个项目是主要项目。您可以在“首选项”窗格中看到这一点,其中 per-project 设置列在“项目:xxx”等标题下,其中“xxx”是主项目的名称。 我不确定一个项目是主要项目的概念是如何发挥作用的。

这里是 PyCharm 文档中的一页,解释了其中的一些内容:

https://www.jetbrains.com/help/pycharm/opening-multiple-projects.html

该页面的以下部分解释了 sub-projects 如何与主要项目交互:

A newly opened project shares the same window as the already opened one. The project that has already been opened, is considered the primary project, and is always shown first in the Project tool window. All the other projects are added to the primary project.

You can import classes and methods from dependent projects. Use the Dependencies project settings to configure this behavior.

Some settings (such as Django, Buildout, Google App Engine, template languages, Python interpreters, content roots) can be configured separately for each project.

您还可以通过创建多个 Run/Debug 配置来配置独立于项目环境的不同执行环境。这些设置控制执行时发生的事情,但不影响语法检查和突出显示、代码完成等。

我已经接受了@Steve 非常详细的回答,并且发现它对我走上正轨非常有用。但是对于我的特定 IntelliJ 版本(MacOS 上的 2020.1.2),我必须对其进行一些不同的设置,所以我将我所做的作为替代答案包括在内:

请注意,对于我的 IntelliJ 版本和这种方法,用作 python 根的子目录不需要是项目本身,就像 Steve 的回答中那样。

步骤 1) 为项目的子目录设置一个 virtualenv,作为 python 代码的根目录。我用的是python诗歌,不管你用什么方法,记下virualenv的python可执行文件的路径,因为你稍后需要在IntelliJ中输入它。

步骤 2) 打开文件 -> 项目结构。 window 弹出(最终我花了 30 秒左右)。

步骤 3) 在项目结构左侧的面板上 window、select“模块”

第4步)左起第二列的顶部是+ - 和复制图标。单击 + 图标。出现一个下拉菜单,您应该 select“导入模块”,导致出现另一个弹出窗口。

第 5 步)在弹出窗口中,导航到项目的子目录,该子目录将用作 python 脚本的根目录,并使用右下角的“打开”按钮 select 它.弹出窗口 window 消失,几秒钟后出现“导入模块”弹出窗口 window。

步骤 6) 在导入模块中 window select“从现有源创建模块”然后单击下一步按钮并按照类似向导的步骤操作,这将使您有机会指定您在步骤 1 中设置的 virtualenv 路径。

第 7 步) 单击“导入模块”的“完成”window,您应该已完成设置。