Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/279.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在同一目录或子目录中导入类?_Python_Python Import - Fatal编程技术网

Python 如何在同一目录或子目录中导入类?

Python 如何在同一目录或子目录中导入类?,python,python-import,Python,Python Import,我有一个存储所有.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 Pyth

我有一个存储所有.py文件的目录

bin/
   main.py
   user.py # where class User resides
   dir.py # where class Dir resides
我想在main.py中使用user.pydir.py中的类 如何将这些Python类导入到main.py
此外,如果User.py位于子目录中,如何导入类
User

bin/
    dir.py
    main.py
    usr/
        user.py
Python 2 在与文件相同的目录中创建一个名为
\uuuu init\uuuu.py
的空文件。这将向Python表示“可以从此目录导入”

那就做

from user import User
from dir import Dir
如果文件位于子目录中,同样适用-也在子目录中放置一个
\uuuu init\uuuu.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

在您的
main.py
中:

from user import Class
其中
Class
是要导入的类的名称

如果要调用
的方法,可以使用以下方法调用它:

Class.method


请注意,在同一目录中应该有一个空的
\uuuu init\uuuu.py
文件

为了更容易理解:

第1步:让我们转到一个目录,其中包含所有内容

$ cd /var/tmp
步骤2:现在让我们创建一个class1.py文件,该文件有一个类名class1和一些代码

$ cat > class1.py <<\EOF
class Class1:
    OKBLUE = '\033[94m'
    ENDC = '\033[0m'
    OK = OKBLUE + "[Class1 OK]: " + ENDC
EOF
$ cat > class2.py <<\EOF
class Class2:
    OKBLUE = '\033[94m'
    ENDC = '\033[0m'
    OK = OKBLUE + "[Class2 OK]: " + ENDC
EOF
输出将是

[Class1 OK]: 
[Class2 OK]:

如果不想将函数和类与您的模块混合使用,您可以导入模块并通过其名称进行访问

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)
我刚刚了解到(多亏了)为了从同一目录中的文件导入类,现在可以用Python 3编写:

from .user import User
from .dir import Dir
只是太简短了, 创建一个文件
\uuuu init\uuuuu.py
is classes目录,然后将其导入脚本,如下所示(导入所有大小写)

仅导入选定的类

from classes.myscript import User
from classes.myscript import Dir

Python 3


相同的
目录

导入文件:
log.py

导入类:
SampleApp()

目录是
basic

导入文件:
log.py

导入类:
SampleApp()


在python3中,
\uuuu init\uuuu.py
是。如果控制台的当前目录是python脚本所在的目录,那么一切都可以正常工作

import user
但是,如果从不包含
user.py

在这种情况下,使用

from . import user

即使您希望导入整个文件,而不仅仅是其中的一个类,这种方法仍然有效。

从同一目录导入

from . import the_file_you_want_to_import 
要从子目录导入,该目录应包含

init.py

文件,而不是你的文件


从目录导入您的_文件

如果user.py和dir.py不包括类,则

from.user导入用户
from.dir导入dir
它不起作用。然后,您应该作为

来自。导入用户
从…起导入目录

蟒蛇3

使用


像这样

我不确定为什么会这样,但使用Pycharm构建
从文件中导入相同的目录类名称

IDE对此表示不满,但它似乎仍然有效。我正在为python3使用python3.7

从同级导入:
from.user导入user


从nephew导入:
from.usr.user导入user

如果您在同一文件夹中有
filename.py
,您可以像这样轻松导入它:

导入文件名

我使用的是python3.7

如果
\uuu init\uuuuuuuuuuuuupy
不是空的,那么
\uuuu init\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuupy.py
中的内容就是导入包时可用的内容(而没有导入
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu?如果我将所有三个文件放在同一个目录中,并运行
main.py
,那么它就能够
从其他两个模块导入
。我遗漏了什么?因为Python就是这样标识允许导入的目录的。您正在运行的脚本的目录是一个例外-您总是可以从中导入。@nbro&Amber:FWIW,我认为在
\uuuu init\uuuuuuuuuuy
和能够导入同一目录中的其他模块方面发生了微妙的变化。具体地说,
import
s与在Python 2.7.8中工作的
init\uuuuuuuuupy.py
文件本身位于同一目录中的其他模块在Python 3.4.1中失败。为了解决这个问题,我必须在它们前面加上子目录名和一个点(即,
import module
必须改为
import subdirectory.module
)。幸运的是,在完成此操作后,它仍然在Python 2.7.8中工作。我可以确认此解决方案不再起作用。您可能希望更正,修改或完全删除它。另请参阅中的答案。如果我尝试此操作,则会出现以下错误
ValueError:尝试在非软件包中进行相对导入
,但当我从用户导入用户更改为
时,错误消失。fileloader导入fileloader并获取导入错误:无法导入名称“fileloader”@Korpel:在中的讨论中,我逐渐意识到,上述给定导入是否有效取决于:[1]如何调用脚本(是否作为包)[2]执行脚本时实际的工作路径在哪里[3]运行环境的path变量如何使用populated@Korpel当前位置我注意到了。只有当存在init.py文件(如果没有)时,才需要模块名。可以/必须省略。为什么很难找到一个明确的answ
# 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!
import log
if __name__ == "__main__":
    app = log.SampleApp()
    app.mainloop()
from basic import log
if __name__ == "__main__":
    app = log.SampleApp()
    app.mainloop()
import user
from . import user
from . import the_file_you_want_to_import 
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
# 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!