如何从 Python 3.9 中与 main.py 相同目录中的文件导入 类 和函数?

How to import classes and function from files within the same dir as main.py in Python 3.9?

我正在努力导入与 Python 3.9 中的 main.py 位于同一目录中的本地源文件。我以前让它工作但是 不知道为什么它在工作。一段时间后它停止工作。

我创建了一个最小示例来重现具有如下所示结构的问题。

我读过一些 available answers 建议在 main.py 中使用 from . import car,这导致了 以下错误:

(venv) [.../pyimport_example/productname]  python3 ./main.py
Traceback (most recent call last):
  File "/Users/myUser/pyimport_example/productname/./main.py", line 1, in <module>
    from . import car
ImportError: attempted relative import with no known parent package

使用from .car import Car

时出现同样的错误

我也尝试 运行 main.py 作为一个模块,如“Relative imports in Python 3:

(venv) [.../pyimport_example/productname] python3 -m main.py
Traceback (most recent call last):
  File "/usr/local/Cellar/python@3.9/3.9.10/Frameworks/Python.framework/Versions/3.9/lib/python3.9/runpy.py", line 188, in _run_module_as_main
    mod_name, mod_spec, code = _get_module_details(mod_name, _Error)
  File "/usr/local/Cellar/python@3.9/3.9.10/Frameworks/Python.framework/Versions/3.9/lib/python3.9/runpy.py", line 111, in _get_module_details
    __import__(pkg_name)
  File "/Users/myUser/pyimport_example/productname/main.py", line 2, in <module>
    from .car import Car
ImportError: attempted relative import with no known parent package

Relative imports in Python 3 的答案似乎集中在人们想要 运行 一个 python 文件作为 包中的脚本,这不是我遇到的问题。

我的示例项目

pyimport_example
├── README.md
├── productname
│   ├── __init__.py
│   ├── car.py
│   └── main.py
└── venv
    ├── bin
    ├── include
    ├── lib
    └── pyvenv.cfg

main.py

的内容
from .car import Car


def main():
    print("Maria ist cool.")

    mycar = Car("Ford", "Mustang", "1966")
    mycar.print_car()


if __name__ == '__main__':
    main()

car.py

的内容
class Car:
    def __init__(self, make, model, year_manufacture):
        self.make = make
        self.model = model
        self.year_manufacture = year_manufacture

    def print_model(self):
        print("{0} {1} {2}".format(self.year_manufacture, self.make, self.model))

有没有不修改系统路径的修复方法?

您必须修改您的 __init__.py-文件。

在文件夹 productname 中,您想指定可以从同一级别的模块运行 导入哪些内容:

from .car import *

现在您应该可以使用以下方法将文件导入 main.py

from car import Car