首先,关于堆栈溢出有很多解决方案,但是从我尝试过的解决方案中,没有一个起作用。我正在远程计算机(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_1
的module_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 not
module2.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
)。
如果你不想打包库,那么你可以添加sys.path.append("../")
在main.py
增加“的project-dir/
文件夹的路径。随着你的yourlib
图书馆将以‘导入的’ main.py
,你可以这样做from yourlib import module_2
,它会正常工作(并module_2
可以使用相对进口)。另外,您也可以直接把main.py
中project-dir/
文件夹,你不必改变sys.path
所有,因为project-dir/
会在这种情况下,“工作目录”。
请注意,您还可以在其中包含一个tests
文件夹,project-dir
并且要运行测试文件,可以执行与运行相同的操作main.py
。
先前的解决方案已经解决了您的问题,但加倍努力会带来一些好处,例如依赖管理,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_
使用有组织的项目结构,并为您执行的脚本提供清晰的位置。特别是,如果您执行的脚本位于模块所在文件夹的外部,则更好。另外,不要将模块作为脚本运行(否则您不能使用相对导入)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句