【问题标题】:How to programmatically add root folder to the path for every script?如何以编程方式将根文件夹添加到每个脚本的路径?
【发布时间】:2021-11-17 23:21:53
【问题描述】:

我目前的文件结构是这样的:

__init__.py
script_folder
    __init__.py
    s1.py
    s2.py
b_folder
    __init__.py
    b1.py
    b2.py
lib_folder
    __init__.py
    lib1.py
    libb2.py

b_folder 中的文件可以使用lib_folder 中的文件,script_folder 中的脚本可以使用b_folderlib_folder 中的文件。我按如下方式导入:

from lib_folder.lib1 import func_1

如果我添加,从其他文件夹导入似乎可以工作

import sys; sys.path.insert(0, '.') 

到从另一个文件夹导入的每个文件。像这样,一切正常。但是这条重复的行污染了我的代码。

我想知道是否有一种方法可以将根文件夹添加到项目范围或目录范围的路径,而不必为每个需要从另一个文件夹导入内容的文件添加任何魔法线?

在我的计算机上更改$PATH 对我来说不是一个好的解决方案,因为代码应该在其他计算机上运行。

我尝试将import sys; sys.path.insert(0, '.') 添加到所有__init__.py,但似乎没有任何区别。

我的launch.json(在 Visual Studio Code 中)如下:

【问题讨论】:

    标签: python import python-import relative-import


    【解决方案1】:

    是的,有一种方法,它实际上是运行 python 脚本的规范方法。您必须将脚本作为它们所属的包的一部分从根目录运行 - 因此在您的情况下删除顶级 init py(顶级文件夹不是包),删除所有 sys.path 行(这可能导致拔毛虫)和:

    $ ls
    lib_folder b_folder script_folder
    $ python -m script_folder.b1 # note this is not a filesystem notation
    

    以这种方式运行 python 会将所有顶级包添加到路径上,并且导入将正常运行。

    【讨论】:

    • 谢谢,但不幸的是到目前为止它还没有工作。我正在使用 Visual Studio 代码,将 ` "args": ["-m"], ` 添加到基本的 launch.json,得到错误 Cannot find lib_folder 除非我有 import sys; sys.path.insert(0, '.')
    • 将尝试创建最小的示例,并在我有时间的时候尝试让它工作。
    • @YuliaV 我会推荐 PyCharm for python - VS 有运行配置吗?在那里指定 -m 开关 - 并将工作目录更改为 roott 目录(应该是项目目录)
    • 理想情况下,我正在开发的库应该可以在任何机器上运行,而无需用户修改 $PATH,进入编辑器的高级设置等。这就是我要求编程解决方案的原因:)
    • 是的,VSC 有这个配置,我在基本的 launch.json 中添加了 ` "args": ["-m"], `,请参阅code.visualstudio.com/docs/python/debugging 了解一般信息
    猜你喜欢
    • 1970-01-01
    • 2021-11-19
    • 2014-06-11
    • 1970-01-01
    • 2012-05-23
    • 1970-01-01
    • 2011-08-01
    • 1970-01-01
    • 2019-12-22
    相关资源
    最近更新 更多