Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/277.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 - Fatal编程技术网

将python代码拆分为单独的文件

将python代码拆分为单独的文件,python,Python,我正在尝试将常见的python代码拆分为单独的文件 例如,我有以下代码的svr.py import socket PORT = 6060 SERVER = socket.gethostbyname(socket.gethostname()) ADDRESS = (SERVER, PORT) __server = socket.socket(socket.AF_INET, socket.SOCK_STREAM) __server.bind(ADDRESS) def startServer()

我正在尝试将常见的python代码拆分为单独的文件

例如,我有以下代码的svr.py

import socket

PORT = 6060
SERVER = socket.gethostbyname(socket.gethostname())
ADDRESS = (SERVER, PORT)

__server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
__server.bind(ADDRESS)

def startServer():
   pass

startServer()
因此,我考虑将其拆分为2个python文件,因为公共部分(bcode.py)将在svr.py和client.py中使用

文件:bcode.py具有以下代码

import socket

PORT = 6060
SERVER = socket.gethostbyname(socket.gethostname())
ADDRESS = (SERVER, PORT)
import socket
import bcode

__server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
__server.bind(ADDRESS)

def startServer():
   pass

startServer()
文件:svr.py具有以下代码

import socket

PORT = 6060
SERVER = socket.gethostbyname(socket.gethostname())
ADDRESS = (SERVER, PORT)
import socket
import bcode

__server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
__server.bind(ADDRESS)

def startServer():
   pass

startServer()
根据我在导入bcode时的理解,python解释器execude bcode.py应该在内存中具有常量端口、服务器和地址,但当我运行svr.py时,我收到以下错误消息:

Traceback (most recent call last):
  File "C:\temp\PythonProject\svr.py", line 9, in <module>
    __server.bind(ADDRESS)
NameError: name 'ADDRESS' is not defined

Process finished with exit code 1
回溯(最近一次呼叫最后一次):
文件“C:\temp\PythonProject\svr.py”,第9行,在
__server.bind(地址)
名称错误:未定义名称“地址”
进程已完成,退出代码为1
即使在导入bcode之后,svr.py中的地址常量似乎也不可用,而且我还需要在svr.py上添加导入套接字,我认为因为我已经在bcode.py中导入套接字,并且当svr.py导入bcode时,导入套接字也会被带入svr.py


如果您能帮助我了解Python中拆分常见代码的最佳方法,我将不胜感激。

首先,我认为将代码拆分为模块是一个非常好的主意。它将帮助您保持代码干净整洁

然后,当您在Python中导入一个模块时,您将决定其内容包含在哪个名称空间下。在您的示例中,您使用了标准的导入方式,即
import bcode
。通过这种方法,
bcode
的所有内容都受
bcode
名称空间的约束,因此必须引用:

导入bcode
打印(b代码地址)
这也是我推荐的方法,因为当文件数量和代码行增加时,它可以保持名称空间干净整洁。这样,就不会怀疑使用了哪个
地址

但是,还有其他导入模块的方法,例如通过
从bcode import ADDRESS
显式导入所选变量。但是,想象一下这样做

ADDRESS=“127.0.0.1”
从bcode导入地址
打印(地址)#b代码中的任何内容。。
现在这可能还可以,但是其他阅读您代码的人可能会忽略这样一个事实,即您重写了变量,或者忘记了变量的来源

还有一种方法允许您使用
*
将模块的所有内容导入到本地命名空间下。这个解决方案对于小脚本来说是可以接受的,但是,你可能会让你未来的自我(或学院)变得非常麻烦,因为从长远来看,你肯定会失去对你的名字(即变量、函数、类等)的控制

ADDRESS=“127.0.0.1”
从bcode导入*
打印(地址)#b代码中的任何内容。。
打印(端口)#b代码中的任何内容。。
我强烈建议您坚持使用第一种方法(正如您已经使用的那样),并记住适当地引用变量

最后,您还应该注意重命名名称空间/模块的可能性。我也不建议这样做,但它可能会在缩短长模块名称时派上用场。标准库中一些常用的模块有一些常用的缩写,例如
numpy
模块,通常被称为
np

将numpy导入为np
将matplotlib.pyplot作为plt导入
x=np.linspace(0,5100)
y=x**2
平面图(x,y)

好的,您有
导入bcode
,但您的意思是:
bcode.ADDRESS
?或者,
从bcode导入ADDRESS
。。甚至可以从bcode导入*获得
。但是,我建议使用@quamrana的建议:当您的文件变大时,它将始终保持清晰和整洁。也就是说,只有
导入bcode
,并且始终通过完全引用使用变量,
\uu server.bind(bcode.ADDRESS)
。您已经导入了bcode,因此使用
bcode.ADDRESS
而不是
导入bcode.ADDRESS
,这是否回答了您的问题?嗨,谢谢你的建议。我没有意识到我在引用导入文件时需要放置名称空间,我认为导入类似于include(将两个文件合并成一个大文件,因此我只按原样调用变量名)。我只是尝试使用bcode.ADDRESS引用,它就可以工作了。再次感谢你。问候-哈里斯-