Ouu*_*iii 6 python python-import python-3.x
我正在使用 Visual Studio Code 和 Python 3.7.0,我只是尝试将另一个 Python 文件从另一个文件夹导入到我的 python 文件中。
\n这是我的文件夹结构
\nroot/\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\nRun Code Online (Sandbox Code Playgroud)\n例如在文件task11.py中:
\nfrom Helpers.FileHelper.ReadHelper import *
import os, sys\nparentPath = os.path.abspath("../../")\nif parentPath not in sys.path:\n sys.path.insert(0, parentPath)\nfrom Helpers.FileHelper.ReadHelper import *\nRun Code Online (Sandbox Code Playgroud)\nimport os, sys\nsys.path.append(\'../../\')\nfrom Helpers.FileHelper.ReadHelper import *\nRun Code Online (Sandbox Code Playgroud)\n上述解决方案都不起作用,因为我总是遇到错误:\nModuleNotFoundError: No module named \'Helpers\'
我也尝试过:
\nfrom ..Helpers.FileHelper.ReadHelper import *但最终会出现错误:ValueError: attempted relative import beyond top-level package
那么如何将该文件导入ReadHelper.py到我的任务文件中呢?
有一些与此类似的问题,但它们确实很旧,而且答案对我没有帮助。
\nVisual Studio代码中有一个选项,
如果我通过此导入运行此命令,from Helpers.FileHelper import ReadHelper则不会生成任何错误并且代码可以完美执行。
一个缺点是这个交互式窗口启动速度很慢并且无法处理输入。
\n我也尝试了@Omni的答案:
\n$> python -m root.dir1.task11\nRun Code Online (Sandbox Code Playgroud)\n它成功了!但正如他所说,有一个缺点:在终端中输入速度很慢。
\n因此,我尝试在 Visual Studio Code 中创建一个任务,该任务可以为我当前所在的文件执行上述 shell 命令,但没有成功。
\n你知道如何在 vscode 中创建一个任务来运行上述命令吗?
\n我还尝试__init__.py在每个目录下添加 -files ,以便它们被视为包Python3 Tutorial - 6.4 Module Packages。但这并没有帮助,并且发生了同样的错误。
我想出了一种方法,可以非常轻松地拥有这样的文件夹结构,并使导入在终端中正常工作。
\n基本上我所做的是:
\n有了这个,我现在只需按 即可运行带有导入的 python 文件cmd + shift + B。
视觉工作室任务:
\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}\nRun Code Online (Sandbox Code Playgroud)\n我们要关注的部分是:
\n"command": "python3 /PATH_TO_ROOT_FOLDER/run_python_file.py ${file}",
蟒蛇脚本:
\nimport 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()\nRun Code Online (Sandbox Code Playgroud)\n通过这些修改,我可以运行根目录中的任何文件,并从根目录中的任何文件导入。
\n我只需按 即可做到cmd + shift + B。
您可以尝试使用允许使用 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)
| 归档时间: |
|
| 查看次数: |
10445 次 |
| 最近记录: |