如何导入同一目录或子目录内的类?
- 2024-12-18 08:39:00
- admin 原创
- 165
问题描述:
我有一个存储所有.py文件的目录。
bin/
main.py
user.py # where class User resides
dir.py # where class Dir resides
我想在main.py中使用user.py和dir.py中的类。
如何将这些 Python 类导入到main.py中?此外,如果user.py位于子目录中,
如何导入类?
User
bin/
dir.py
main.py
usr/
user.py
解决方案 1:
Python 2
在与文件相同的目录中创建一个名为 的空文件__init__.py
。这将向 Python 表示“可以从此目录导入”。
然后就这么做...
from user import User
from dir import Dir
如果文件位于子目录中,情况也是如此 -__init__.py
也将其放在子目录中,然后使用常规导入语句,带点符号。对于每个目录级别,您都需要添加到导入路径。
bin/
main.py
classes/
user.py
dir.py
因此,如果目录名为“classes”,那么您可以执行以下操作:
from classes.user import User
from classes.dir import Dir
Python 3
.
与前一个相同,但如果不使用子目录,则在模块名称前加上前缀:
from .user import User
from .dir import Dir
解决方案 2:
我刚刚了解到(感谢martineau 的评论),为了从同一目录内的文件导入类,现在可以使用 Python 3 编写:
from .user import User
from .dir import Dir
解决方案 3:
从 python3.3 开始,__init__.py
不再需要。如果控制台的当前目录是 python 脚本所在的目录,则一切都正常
import user
但是,如果从不包含 的其他目录调用,则此方法无效user.py
。
在这种情况下,请使用
from . import user
即使您想导入整个文件而不是仅仅导入其中一个类,这种方法也是有效的。
解决方案 4:
在您的main.py
:
from user import Class
其中Class
是您要导入的类的名称。
如果你想调用的方法Class
,你可以使用以下方式调用它:
Class.method
__init__.py
请注意,同一目录中应该有一个空文件。
解决方案 5:
如果 user.py 和 dir.py 不包含类,那么
from .user import User
from .dir import Dir
不起作用。然后您应该导入为
from . import user
from . import dir
解决方案 6:
如果你不想将函数和类混在一起,你可以导入模块并通过其名称进行访问
import util # imports util.py
util.clean()
util.setup(4)
或者你可以将函数和类导入到你的代码中
from util import clean, setup
clean()
setup(4)
您可以使用 wildchar * 将该模块中的所有内容导入到您的代码中
from util import *
clean()
setup(4)
解决方案 7:
对于 Python 3+,假设您有以下结构:
A/
__init__.py
bar.py
foo.py
在您的__init__.py
文件中,您可以输入from . import foo
然后你可以在 bar 文件中导入 foo
# A/bar.py
from foo import YourClass
这些文件的目的__init__.py
是包含在遇到包的不同级别时运行的可选初始化代码。您放入的所有内容都__init__.py
将在包加载期间初始化。
解决方案 8:
为了使其更容易理解:
步骤 1:让我们进入一个目录,其中包含所有内容
$ cd /var/tmp
步骤 2:现在让我们创建一个 class1.py 文件,其中包含类名 Class1 和一些代码
$ cat > class1.py <<EOF
class Class1:
OKBLUE = '[94m'
ENDC = '[0m'
OK = OKBLUE + "[Class1 OK]: " + ENDC
EOF
步骤 3:现在让我们创建一个 class2.py 文件,其中包含类名 Class2 和一些代码
$ cat > class2.py <<EOF
class Class2:
OKBLUE = '[94m'
ENDC = '[0m'
OK = OKBLUE + "[Class2 OK]: " + ENDC
EOF
步骤 4:现在让我们创建一个 main.py,它将执行一次以使用来自两个不同文件的 Class1 和 Class2
$ cat > main.py <<EOF
"""this is how we are actually calling class1.py and from that file loading Class1"""
from class1 import Class1
"""this is how we are actually calling class2.py and from that file loading Class2"""
from class2 import Class2
print Class1.OK
print Class2.OK
EOF
步骤 5:运行程序
$ python main.py
输出将是
[Class1 OK]:
[Class2 OK]:
解决方案 9:
Python 3
相同的directory
。
导入文件:log.py
导入类:SampleApp()
。
import log
if __name__ == "__main__":
app = log.SampleApp()
app.mainloop()
或者
目录是basic
。
导入文件:log.py
。
导入类:SampleApp()
。
from basic import log
if __name__ == "__main__":
app = log.SampleApp()
app.mainloop()
解决方案 10:
from user import User
from dir import Dir
解决方案 11:
我不确定为什么这个有效,但使用 Pycharm 构建from file_in_same_dir import class_name
IDE 对此表示抱怨,但似乎它仍然有效。我使用的是 Python 3.7
解决方案 12:
对于python3
从兄弟姐妹导入:from .user import User
从侄子导入:from .usr.user import User
解决方案 13:
事实上,Python 并没有为这种日常用例提供优雅的解决方案。当你测试最终将作为 Python 包的一部分交付的代码时,这个问题尤其严重。以下是一种对我有用的方法:
目录 |
文件1.py
文件2.py
假设您想从 file1 导入 file2。
# In file1.py:
try:
# This works when packaged as Python package
from . import file2
except:
# This works when simply invoking file1 as a module (i.e. python file1)
import file2
# rest of the code ...
解决方案 14:
如果您filename.py
在同一个文件夹中,您可以轻松地像这样导入它:
import filename
我正在使用 python3.7
解决方案 15:
我无法对最佳答案提交编辑,因此根据上面评论中给出的一些指示,另一件要尝试的事情是:
from subfolder.MyClassFile import MyClass
就是这样。只需记住在我们的 中有一个__init__.py
空文件即可subfolder
。
仅供参考,如果您的结构如下,则该解决方案有效:
your_project/
__ini__.py
main.py
subfolder/
__init__.py
MyClassFile.py <-- You want this
MyClassFile.py
包含类MyClass
。
解决方案 16:
Python3
使用
from .user import User inside dir.py file
和
use from class.dir import Dir inside main.py
or from class.usr import User inside main.py
就像这样
解决方案 17:
# My Python version: 3.7
# IDE: Pycharm 2021.1.2 Community
# Have "myLib" in folder "labs":
class Points:
def __init__(self, x = 0, y = 0):
self.__x = x
self.__y = y
def __str__(self):
return f"x = {self.__x}, y = {self.__y}"
# Have "myFile" in (same) folder "labs":
from myFile import Point
p1 = Point(1, 4)
p2 = Point(1, 4)
print(f"p1: {p1}, p2: {p2}")
# Result:
# p1: x = 1, y = 4, p2: x = 1, y = 4
# Good Luck!
解决方案 18:
在一个足够复杂的项目中,我们无法使用 python 导入来执行 hello world。当所有其他方法都失败时,我使用以下方法取得了一些成功
sys.path.append(os.path.join(pathlib.Path(__file__).parent.resolve()))
解决方案 19:
太简短了,创建一个文件__init__.py
是类目录,然后像下面这样将其导入到你的脚本中(导入所有情况)
from classes.myscript import *
仅导入选定的类
from classes.myscript import User
from classes.myscript import Dir
解决方案 20:
从同一目录导入
from . import the_file_you_want_to_import
从子目录导入目录应该包含
初始化.py
那么除了你的文件之外的文件
从目录导入你的文件
扫码咨询,免费领取项目管理大礼包!