从非子文件夹的另一个文件夹导入 python 文件

Ouu*_*iii 6 python python-import python-3.x

我想要的是

\n

我正在使用 Visual Studio Code 和 Python 3.7.0,我只是尝试将另一个 Python 文件从另一个文件夹导入到我的 python 文件中

\n
\n

细节

\n

这是我的文件夹结构

\n
root/\n    dir1/\n        data.txt\n        task11.py\n        task12.py\n    dir2/\n        data.txt\n        task21.py\n        task22.py\n    Helpers/\n        FileHelper/\n            ReadHelper.py\n
Run Code Online (Sandbox Code Playgroud)\n

所以一个简短的解释:

\n
    \n
  • 我在每个“任务”文件中使用相同的函数
  • \n
  • 我没有将函数放入每个“任务”文件中,而是创建了函数存在的帮助程序文件
  • \n
  • 我想将帮助程序文件“ReadHelper.py”导入到我的任务文件中
  • \n
\n
\n

我尝试过的

\n

例如在文件task11.py中:

\n\n

上述解决方案都不起作用,因为我总是遇到错误:\nModuleNotFoundError: No module named \'Helpers\'

\n

我也尝试过:

\n
    \n
  • from ..Helpers.FileHelper.ReadHelper import *
  • \n
\n

但最终会出现错误:ValueError: attempted relative import beyond top-level package

\n

那么如何将该文件导入ReadHelper.py到我的任务文件中呢?

\n
\n

聚苯乙烯

\n

有一些与此类似的问题,但它们确实很旧,而且答案对我没有帮助。

\n
\n

更新1

\n

Visual Studio代码中有一个选项,vscode python 命令如果我通过此导入运行此命令,from Helpers.FileHelper import ReadHelper则不会生成任何错误并且代码可以完美执行。

\n

一个缺点是这个交互式窗口启动速度很慢并且无法处理输入。

\n

我也尝试了@Omni的答案:

\n
$> python -m root.dir1.task11\n
Run Code Online (Sandbox Code Playgroud)\n

它成功了!但正如他所说,有一个缺点:在终端中输入速度很慢。

\n

因此,我尝试在 Visual Studio Code 中创建一个任务,该任务可以为我当前所在的文件执行上述 shell 命令,但没有成功。

\n

你知道如何在 vscode 中创建一个任务来运行上述命令吗?

\n
\n

我还尝试__init__.py在每个目录下添加 -files ,以便它们被视为包Python3 Tutorial - 6.4 Module Packages。但这并没有帮助,并且发生了同样的错误。

\n
\n

更新2

\n

我想出了一种方法,可以非常轻松地拥有这样的文件夹结构,并使导入在终端中正常工作。

\n

基本上我所做的是:

\n
    \n
  • 创建了一个Python脚本
  • \n
  • 在 Visual Studio Code 中创建了一个任务
  • \n
\n

有了这个,我现在只需按 即可运行带有导入的 python 文件cmd + shift + B

\n
\n

解释

\n

视觉工作室任务:

\n
{\n    "version": "2.0.0",\n    "tasks": [\n        {\n            "label": "Run python file",\n            "type": "shell",\n            "command": "python3 /PATH_TO_ROOT_FOLDER/run_python_file.py ${file}",\n            "group": {\n                "kind": "build",\n                "isDefault": true\n            },\n            "presentation": {\n                "reveal": "always",\n                "panel": "new",\n                "focus": true\n            }\n        }\n    ]\n}\n
Run Code Online (Sandbox Code Playgroud)\n

我们要关注的部分是:

\n

"command": "python3 /PATH_TO_ROOT_FOLDER/run_python_file.py ${file}",

\n
    \n
  • 这部分运行我在根文件夹中创建的新 python 文件,并将活动文件的路径作为参数传递
  • \n
\n

蟒蛇脚本:

\n
import os, sys\n\n# This is a argument given trough a shell command\nPATH_TO_MODULE_TO_RUN = sys.argv[1]\n\nROOT_FOLDER = "root/"\n\ndef run_module_gotten_from_shell():\n    # Here I take only the part of the path that is needed\n    relative_path_to_file = PATH_TO_MODULE_TO_RUN.split(ROOT_FOLDER)[1]\n    \n    # Creating the shell command I want to run\n    shell_command = createShellCommand(relative_path_to_file)\n\n    os.system(shell_command)\n\n\n# Returning "python3 -m PATH.TO.MODULE"\ndef createShellCommand(relative_path_to_file):\n    part1 = "python3"\n    part2 = "-m"\n\n    # Here I change the string "dir1/task11.py" => "dir1.task11"\n    part3 = relative_path_to_file.replace("/", ".")[:-3]\n\n    shell_command = "{:s} {:s} {:s}".format(part1, part2, part3)\n    return shell_command\n\nrun_module_gotten_from_shell()\n
Run Code Online (Sandbox Code Playgroud)\n
    \n
  • 此 python 脚本获取活动文件的路径作为参数
  • \n
  • 然后它创建路径的 shell 命令(shell 命令类似于 @kasper-kein\xc3\xa4nen \ 的答案)
  • \n
  • 然后它运行该 shell 命令
  • \n
\n

通过这些修改,我可以运行根目录中的任何文件,并从根目录中的任何文件导入。

\n

我只需按 即可做到cmd + shift + B

\n

Kas*_*nen 2

您可以尝试使用允许使用 Python 模块命名空间docs.python.org-m定位模块的选项来运行脚本。

如果运行 task11.py 脚本,则:

$ python3 -m dir1.task11 
Run Code Online (Sandbox Code Playgroud)

在task11.py中进行如下导入:

from Helpers.FileHelper.ReadHelper import *
Run Code Online (Sandbox Code Playgroud)