从当前工作目录上方的目录导入模块

力拓1210

首先,关于堆栈溢出有很多解决方案,但是从我尝试过的解决方案中,没有一个起作用。我正在远程计算机(Linux)上工作。我正在dir-2/module_2.py使用ipython解释器文件中制作原型另外,我试图避免使用绝对路径,因为此远程计算机中的绝对路径又长又丑陋,并且我希望我的代码在下载时可以在其他计算机上运行。

我的目录结构如下:

/project-dir/
            -/dir-1/
                  -/__ init__.py
                  -/module_1.py
            -/dir-2/
                  -/__ init__.py
                  -/module_2.py
                  -/module_3.py

现在,我想导入module_1module_2但是,此stackoverflow帖子中提到的解决方案:使用链接

sys.path.append('../..')
import module_2

不起作用。我得到错误:ModuleNotFoundError: No module named 'module_1'

而且,在ipython解释器中,诸如import .module_3之类的东西module_2会引发错误:

import .module_3
       ^ SyntaxError: invalid syntax

点运算符也不应该在同一目录中工作吗?总的来说,我对导入机制感到很困惑。非常感谢您对最初问题的任何帮助!非常感谢!

我们给予

为什么不起作用?

如果运行module1.py文件并要导入,module2则需要类似

sys.path.append("../dir-2")

如果您在其中使用sys.path.append("../..") then the folder you added to the path is the folder containing project-dir and there is notmodule2.py`文件。


语法import .module_3用于相对导入。如果您尝试执行module2.py并包含import .module_3它,则该命令将不起作用,因为您正在将其module2.py用作脚本。要使用相对导入,您需要将module2.py和都module_3.py视为模块。也就是说,其他一些文件导入module2和module2使用此语法从module3导入某些内容。

有关如何进行的建议

解决这两个问题的一种可能的解决方案是组织项目的属性,以及(可选地,是个好主意)打包您的库(即,使代码“可安装”)。然后,在安装库(在虚拟环境中工作)之后,您就不需要hackysys.path解决方案了您将能够从任何文件夹导入库。

此外,请勿将您的模块视为脚本(请勿运行您的模块)。使用一个单独的python文件作为您的“可执行文件”(或入口点),并从那里导入您需要的所有内容。这样,module*.py文件中的相对导入将可以正常工作,并且您不会感到困惑。

一个可能的目录结构可能是

/project-dir/
            - apps/
                  - main.py
            - yourlib/
                  -/__ init__.py
                  -/dir-1/
                        -/__ init__.py
                        -/module_1.py
                  -/dir-2/
                        -/__ init__.py
                        -/module_2.py
                        -/module_3.py

请注意,该yourlib文件夹以及子文件夹都包含一个__init__.py文件。使用这种结构,您只需运行main.py(名称不必为main.py)。

情况1:您不想打包您的库

如果你不想打包库,那么你可以添加sys.path.append("../")main.py增加“的project-dir/文件夹的路径。随着你的yourlib图书馆将以‘导入的’ main.py,你可以这样做from yourlib import module_2,它会正常工作(并module_2可以使用相对进口)。另外,您也可以直接把main.pyproject-dir/文件夹,你不必改变sys.path所有,因为project-dir/会在这种情况下,“工作目录”。

请注意,您还可以在其中包含一个tests文件夹,project-dir并且要运行测试文件,可以执行与运行相同的操作main.py

情况2:您想打包您的库

先前的解决方案已经解决了您的问题,但加倍努力会带来一些好处,例如依赖管理,sys.path无论您身在何处都无需更改打包您的图书馆有几种选择,由于其简单性,我将用诗歌展示一种选择

安装诗歌后,您可以在终端中运行以下命令来创建新项目

poetry new mylib

这将创建以下文件夹结构

mylib/
     - README.rst
     - mylib/
            - __init__.py
     - pyproject.toml
     - tests

然后,您可以apps根据需要添加文件夹,以及其中的子文件夹mylib/(每个__init__.py文件都有一个文件)。

pyproject.toml文件指定依赖项和项目元数据。您可以手动编辑和/或使用诗歌添加新的依存关系,例如

poetry add pandas
poetry add --dev mypy

例如,添加pandas为依赖项和mypy开发依赖项。之后,您可以运行

poetry build

创建虚拟环境并在其中安装您的库。您可以使用激活虚拟环境,poetry shell并且可以从任何地方导入库。请注意,您可以更改库文件,而无需poetry build再次运行

最后,如果您想在PyPi中发布您的库,以供所有人查看,您可以使用

poetry publish --username your_pypi_username --password _passowrd_

TL; 博士

使用有组织的项目结构,并为您执行的脚本提供清晰的位置。特别是,如果您执行的脚本位于模块所在文件夹的外部,则更好。另外,不要将模块作为脚本运行(否则您不能使用相对导入)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在当前工作目录中导入模块

来自分类Dev

从当前工作目录相对导入python模块

来自分类Dev

使用os模块返回位于Python当前工作目录正上方的目录名称

来自分类Dev

当我尝试导入当前工作目录中的模块时引发ModuleNotFoundError

来自分类Dev

Jupyter Notebook如何导入不在当前工作目录中的模块?

来自分类Dev

PyCharm当前工作目录

来自分类Dev

当前工作目录的路径

来自分类Dev

无法从当前工作目录之外导入函数

来自分类Dev

Makefile的当前工作目录

来自分类Dev

C ++ Visual Studio当前工作目录

来自分类Dev

如何更改当前工作目录

来自分类Dev

SHAutoComplete和当前工作目录?

来自分类Dev

如何更改当前工作目录?

来自分类Dev

在Assembly中获取当前工作目录

来自分类Dev

Python:从终端获取当前工作目录

来自分类Dev

.bashrc命令复制当前工作目录

来自分类Dev

Zsh提示与当前工作目录

来自分类Dev

打印出当前工作目录

来自分类Dev

WebStorm Dart设置当前工作目录

来自分类Dev

在Assembly中获取当前工作目录

来自分类Dev

在终端中隐藏当前工作目录

来自分类Dev

带有“当前目录”导入的导入模块

来自分类Dev

带有“当前目录”导入的导入模块

来自分类Dev

当目录不是当前工作目录时,如何检查目录是否在 git 工作树中?

来自分类常见问题

如何使用python 3获取当前工作目录?

来自分类Dev

什么决定了Tomcat Java进程的当前工作目录?

来自分类Dev

如何为Java测试设置当前工作目录?

来自分类Dev

SXPG_COMMAND_EXECUTE的当前工作目录?

来自分类Dev

Cordova-当前工作目录不是基于Cordova的项目