246457 远程I/O UR20-4DI-4DO-PN-FSPS-V2远程模块
主要有:电源,隔离器,模块,交换机,变送器,连接器,传感器,防雷器,浪涌保护器,工业插头插座,工具,端子等~产品。
246457 远程I/O UR20-4DI-4DO-PN-FSPS-V2远程模块
1315390000UR20-16DI-N远程IO 1315210000UR20-16DI-P-PLC-INT远程I/O 1315270000UR20-16DO-P-PLC-INT远程I/O 1315670000UR20-8AI-I-PLC-INT远程I/O 1315370000UR20-8DI-N-3W远程IO 1315430000UR20-8DO-N远程IO 1346610000UR20-EBK-ACC远程I/O 1334890000UR20-FBC-CAN远程IO 1334900000UR20-FBC-DN远程IO 1339920000UR20-SM-ACC远程I/O 1791452000电子产品SAI-4/6/8-MHF4PPUR20M 1791462000电子产品SAI-4/6/8-MHF5PPUR20M 1525820000远程I/OPWZ-UR20-HD 1315400000远程I/OUR20-16DI-N-PLC-INT 1315450000远程I/OUR20-16DO-N-PLC-INT 1315580000远程I/OUR20-1CNT-500 2007430000远程I/OUR20-1COM-SAI-PRO 1990070000远程I/OUR20-2AI-SG-24-DIAG 2007420000远程I/OUR20-3EM-230V-AC 1993880000远程I/OUR20-4AI-UI-DIF-16-DIAG 1315740000远程I/OUR20-4COM-IO-LINK 1550070000远程I/OUR20-4DI-2W-230V-AC 2464570000远程I/OUR20-4DI-4DO-PN-FSPS-V2 1315350000远程I/OUR20-4DI-N 1315410000远程I/OUR20-4DO-N 1315420000远程I/OUR20-4DO-N-2A 1315720000远程I/OUR20-8AI-I-16-DIAG-HD 1315650000远程I/OUR20-8AI-I-16-HD 2555940000远程I/OUR20-8AI-RTD-DIAG-2W 2464590000远程I/OUR20-8DI-PN-FSPS-V2 2614380000远程I/OUR20-FBC-PB-DP-V2 1334940000远程I/OUR20-FBC-PL 2566380000远程I/OUR20-FBC-PN-IRT-V2 1334770000远程IOUR20-16AUX-I 1334780000远程IOUR20-16AUX-O 1315200000远程IOUR20-16DI-P 1315440000远程IOUR20-16DO-N 1315250000远程IOUR20-16DO-P 1315570000远程IOUR20-1CNT-100-1DO 1315750000远程IOUR20-1COM-232-485-422 1508090000远程IOUR20-1SSI 1315590000远程IOUR20-2CNT-100 1315610000远程IOUR20-2PWM-PN-2A 1315700000远程IOUR20-4AI-RTD-DIAG 1315710000远程IOUR20-4AI-TC-DIAG 1394390000远程IOUR20-4AI-UI-12 1315620000远程IOUR20-4AI-UI-16 1315680000远程IOUR20-4AO-UI-16 1315170000远程IOUR20-4DI-P 1315220000远程IOUR20-4DO-P 1315230000远程IOUR20-4DO-P-2A 1394420000远程IOUR20-4DO-PN-2A 1315550000远程IOUR20-4RO-CO-255 1315540000远程IOUR20-4RO-SSR-255 1315180000远程IOUR20-8DI-P-2W 1394400000远程IOUR20-8DI-P-3W 1315240000远程IOUR20-8DO-P 1334910000远程IOUR20-FBC-EC 1334920000远程IOUR20-FBC-EIP 1334710000远程IOUR20-PF-I 1334740000远程IOUR20-PF-O 1469340000远程IOUR20-PG0.35 1334790000远程IOUR20-16AUX-FE 1334800000远程IOUR20-16AUX-GND-I 1334810000远程IOUR20-16AUX-GND-O 1508080000远程IOUR20-2FCNT-100 1315600000远程IOUR20-2PWM-PN-0.5A 1315690000远程IOUR20-4AI-UI-16-DIAG 1315730000远程IOUR20-4AO-UI-16-DIAG 1315190000远程IOUR20-8DI-P-3W-HD 1315770000远程IOUR20-ES 1335030000远程IOUR20-PF-O-1DI-SIL 1335040000远程IOUR20-PF-O-2DI-DELAY-SIL 1335050000远程IOUR20-PF-O-2DI-SIL 2453880000远程UR20-4AO-UI-16-M 2476450000远程UR20-FBC-MOD-TCP-V2 。
246457 远程I/O UR20-4DI-4DO-PN-FSPS-V2远程模块
所谓的模块导入,是指在一个模块中使用另一个模块的代码的操作,它有利于代码的复用。也许你看到这个标题,会说我怎么会发这么基础的文章。与此相反。恰恰我觉得这篇文章的内容可以算是Python的进阶技能,会深入地探讨并以真实案例讲解PythonimportHook的知识点。当然为了使文章更系统全面,前面会有小篇幅讲解基础知识点,但请你有耐心的往后读下去,因为后面才是本篇文章的精华所在,希望你不要错过。.导入系统的基础.导入单元构成导入单元有多种,可以是模块包及变量等。对于这些基础的概念,对于新手还是有必要介绍一下它们的区别。模块类似.py,.pyc,.pyd,.so,.dll这样的文件,是Python代码载体的小单元。包还可以细分为两种Regularpackages是一个带有__init__.py文件的文件夹,此文件夹下可包含其他子包,或者模块Namespacepackages关于Namespacepackages,有的人会比较陌生,我这里摘抄官方文档的一段说明来解释一下。Namespacepackages是由多个部分构成的,每个部分为父包增加一个子包。各个部分可能处于文件系统的不同位置。部分也可能处于zip文件中网络上,或者Python在导入期间可以搜索的其他地方。命名空间包并不一定会直接对应到文件系统中的对象;它们有可能是无实体表示的虚拟模块。命名空间包的__path__属性不使用普通的列表。而是使用定制的可迭代类型,如果其父包的路径或者高层级包的sys.path发生改变,这种对象会在该包内的下一次导入尝试时自动执行新的对包部分的搜索。命名空间包没有parent/__init__.py文件。实际上,在导入搜索期间可能找到多个parent目录,每个都由不同的部分所提供。因此parent/one的物理位置不一定与parent/two相邻。在这种情况下,Python将为顶级的parent包创建一个命名空间包,无论是它本身还是它的某个子包被导入。.相对/绝对对导入当我们import导入模块或包时,Python提供两种导入方式相对导入relativeimportimportfoo.bar或者bfooimportbar绝对导入absoluteimportfrom.importB或from..AimportB,其中.表示当前模块,..表示上层模块你可以根据实际需要进行选择,但有必要说明的是,在早期的版本Python.之前,Python默认使用的相对导入。而后来的版本中Python.之后,都以绝对导入为默认使用的导入方式。使用绝对路径和相对路径各有利弊当你在开发维护自己的项目时,应当使用相对路径导入,这样可以避免硬编码带来的麻烦。而使用绝对路径,会让你模块导入结构更加清晰,而且也避免了重名的包冲突而导入错误。.导入的标准写法在PEP中有一条,对模块的导入顺序提出了要求,不同来源模块导入,应该有清晰的界限,使用一空行来分开。import语句应当分行书写#badimportos,sys#goodimportosimportsysimport语句应当使用absoluteimport#badfrom..barimportBar#goodfromfoo.barimporttestimport语句应当放在文件头部,置于模块说明及docb之后,全局变量之前import语句应该按照顺序排列,每组之间用一个空格分隔,按照内置模块,第三方模块,自己所写的模块调用顺序,同时每组内部按照字母表顺序排列#内置模块importosimportsys#第三方模块importflask#本地模块fromfooimportbar.__import__的妙用在Python中使用import关键字来实现模块/包的导入,可以说是基础中的基础。但这不是唯一的方法,还有importlib.import_module和__import__等。对于__import__,普通的开发者,可能就会比较陌生。和import不同的是,__import__是一个函数,也正是因为这个原因,使得__import__的使用会更加灵活,常常用于框架中,对于插件的动态加载。实际上,当我们调用import导入模块时,其内部也是调用了__import__,请看如下两种导入方法,他们是等价的。#使用importimportos#使用__import__os=__import__'os'通过举一反三,下面两种方法同样也是等价的。#使用import..as..importpandasaspd#使用__import__pd=__import__'pandas'上面我说__import__常常用于插件的动态,事实上也只有它能做到相对于import来说。插件通常会位于某一特定的文件夹下,在使用过程中,可能你并不会用到全部的插件,也可能你会新增插件。如果使用import关键字这种硬编码的方式,显然太不优雅了,当你要新增/修改插件的时候,都需要你修改代码。更合适的做法是,将这些插件以配置的方式,写在配置文件中,然后由代码去读取你的配置,动态导入你要使用的插件,即灵活又方便,也不容易出错。假如我的一个项目中,有plugin0plugin0plugin0plugin0四个插件,这些插件下都会实现一个核心方法run。但有时候我不想使用全部的插件,只想使用plugin0plugin0,那我就在配置文件中写我要使用的两个插件。#my.confcustom_plugins=['plugin0','plugin0']那我如何使用动态加载,并运行他们呢。#main.pyforplugininconf.custom_plugins__import__pluginsys.modules[plugin].run.理解模块的缓存在一个模块内部重复引用另一个相同模块,实际并不会导入两次,原因是在使用关键字import导入模块时,它会先检索sys.modules里是否已经载入这个模块了,如果已经载入,则不会再次导入,如果不存在,才会去检索导入这个模块。来实验一下,在my_mod0这个模块里,我import两次my_mod0这个模块,按逻辑每一次import会一次my_mod0里的代码即打印inmod0,但是验证结果是,只打印了一次。$catmy_mod0.pyprint'inmod0'$catmy_mod0.pyimportmy_mod0importmy_mod0$pythonmy_mod0.pyinmod0该现象的解释是因为有sys.modules的存在。sys.modules是一个字典key模块名,value模块对象,它存放着在当前namespace所有已经导入的模块对象。#test_module.pyimportsysprintsys.modules.get'json','NotFound'importjsonprintsys.modules.get'json','NotFound'运行结果如下,可见在导入后json模块后,sys.modules才有了json模块的对象。$pythontest_module.pyNotFoundmodule'json'from'C\Python\lib\json\__init__.pyc'由于有缓存的存在,使得我们无法重新载入一个模块。但若你想反其道行之,可以借助importlib这个神奇的库来实现。事实也确实有此场景,比如在代码调试中,在发现代码有异常并修改后,我们通常要重启服务再次载入程序。这时候,若有了模块重载,就无比方便了,修改完代码后也无需服务的重启,就能继续调试。还是以上面的例子来理解,my_mod0.py改写成如下#my_mod0.pyimportimportlibimportmy_mod0importlib.reloadmy_mod0使用python来执行这个模块,与上面不同的是,这边执行了两次my_mod0.py$pythonmy_mod0.pyinmod0inmod0.查找器与加载器如果指定名称的模块在sys.modules找不到,则将发起调用Python的导入协议以查找和加载该模块。此协议由两个概念性模块构成,即查找器和加载器。一个Python的模块的导入,其实可以再细分为两个过程由查找器实现的模块查找由加载器实现的模块加载.查找器是什么。查找器finder,简单点说,查找器定义了一个模块查找机制,让程序知道该如何找到对应的模块。其实Python内置了多个默认查找器,其存在于sys.b_path中。但这些查找器对应使用者来说,并不是那么重要,因此在Python.之前,Python解释将其隐藏了,我们称之为隐式查找器。#Python.importsyssys.b_path由于这点不利于开发者深入理解import机制,在Python.后,所有的模块导入机制都会通过sys.b_path暴露,不会在有任何隐式导入机制。#Python.importsyssys.b_path[class'_frozen_importlib.BuiltinImporter',class'_frozen_importlib.FrozenImporter',class'_frozen_importlib_external.PathFinder',class'_frozen_importlib_external.PathFinder']观察一下Python默认的这几种查找器finder,可以分为三种一种知道如何导入内置模块一种知道如何导入冻结模块一种知道如何导入来自importpath的模块即pathbasedfinder。那我们能不能自已定义一个查找器呢。当然可以,你只要定义一个实现了find_module方法的类py和py均可,或者实现find_loader类方法仅py有效,如果找到模块需要返回一个loader对象或者ModuleSpec对象后面会讲,没找到需要返回None定义完后,要使用这个查找器,必须注册它,将其插入在sys.b_path的首位,这样就能优先使用。importsysclassMyFinderb@classbdeffind_modulecls,name,path,target=NoneprintImporting,name,path,target#将在后面定义returnMyLoader#由于finder是按顺序读取的,所以必须插入在首位sys.b_path.insert0,MyFinder查找器可以分为两种b+--Finderdeprecated+--MetaPathFinder+--PathEntryFinder这里需要注意的是,在.版前,查找器会直接返回加载器Loader对象,而在.版后,查找器则会返回模块规格说明ModuleSpec,其中包含加载器。而关于什么是加载器和模块规格说明,请继续往后看。.加载器是什么。查找器只负责查找定位找模,而真正负责加载模块的,是加载器loader。一般的loader必须定义名为load_module的方法。为什么这里说一般,因为loader还分多种b+--Finderdeprecated|+--MetaPathFinder|+--PathEntryFinder+--Loader+--ResourceLoader--------++--InspectLoader|+--ExecutionLoader--++--FileLoader+--SourceLoader通过查看源码可知,不同的加载器的抽象方法各有不同。加载器通常由一个查找器返回。详情参见PEP0。那如何自定义我们自己的加载器呢。你只要定义一个实现了load_module方法的类对与导入有关的属性点击查看详情进行校验创建模块对象并绑定所有与导入相关的属性变量到该模块上将此模块保存到sys.modules中顺序很重要,避免递归导入然后加载模块这是核心若加载出错,需要能够处理抛出异常ImportError,若加载成功,则返回module对象若你想看具体的例子,可以接着往后看。.模块的规格说明导入机制在导入期间会使用有关每个模块的多种信息,特别是加载之前。大多数信息都是所有模块通用的。模块规格说明的目的是基于每个模块来封装这些导入相关信息。模块的规格说明会作为模块对象的__spec__属性对外公开。有关模块规格的详细内容请参阅ModuleSpec。在Python.后,查找器不再返回加载器,而是返回ModuleSpec对象,它储存着更多的信息模块名加载器模块绝对路径那如何查看一个模块的ModuleSpec。这边举个例子$catmy_mod0.pyimportmy_mod0printmy_mod0.__spec__$pythonmy_mod0.pyinmod0ModuleSpecname='my_mod0',loader=_frozen_importlib_external.SourceFileLoaderbat0x000000000DBE0,origin='/home/MING/my_mod0.py'从ModuleSpec中可以看到,加载器是包含在内的,那我们如果要重新加载一个模块,是不是又有了另一种思路了。来一起验证一下。现在有两个文件一个是my_info.py#my_info.pyname='python'另一个是main.py#main.pyimportmy_infoprintmy_info.name#加一个断点importpdb。pdb.set_trace#再加载一次my_info.__spec__.loader.load_moduleprintmy_info.name在main.py处,我加了一个断点,目的是当运行到断点处时,我修改my_info.py里的name为ming,以便验证重载是否有效。$pythonmain.pypython/home/MING/main.pymodule-my_info.__spec__.loader.load_modulePdbcming从结果来看,重载是有效的。.导入器是什么。导入器importer,也许你在其他文章里会见到它,但其实它并不是个新鲜的东西。它只是同时实现了查找器和加载器两种接口的对象,所以你可以说导入器importer是查找器finder,也可以说它是加载器loader。.远程导入模块由于Python默认的查找器和加载器仅支持本地的模块的导入,并不支持实现远程模块的导入。为了让你更好的理解PythonImportHook机制,我下面会通过实例演示,如何自己实现远程导入模块的导入器。.动手实现导入器当导入一个包的时候,Python解释器首先会从sys.b_path中拿到查找器列表。默认顺序是内建模块查找器-冻结模块查找器-第三方模块路径本地的sys.path查找器若经过这三个查找器,仍然无法查找到所需的模块,则会抛出ImportError异常。因此要实现远程导入模块,有两种思路。一种是实现自己的元路径导入器;另一种是编写一个钩子,添加到sys.path_hooks里,识别特定的目录命名模式。我这里选择第一种方法来做为示例。实现导入器,我们需要分别查找器和加载器。首先是查找器由源码得知,路径查找器分为两种MetaPathFinderPathEntryFinder这里使用MetaPathFinder来进行查找器的编写。在Python.版本之前,查找器必须实现find_module方法,而Python.+版,则推荐使用find_spec方法,但这并不意味着你不能使用find_module,但是在没有find_spec方法时,导入协议还是会尝试find_module方法。我先举例下使用find_module该如何写。fromimportlibimportabcclassUrlMetaFinderabc.MetaPathFinderdef__init__self,basebself._baseb=basebdeffind_moduleself,fullname,path=NoneifpathisNonebaseb=self._basebelse#不是原定义的b就直接返回不存在ifnotpath.startswithself._basebreturnNonebaseb=pathtryloader=UrlMetaLoaderbaseb#loader.load_modulefullnameexceptExceptionreturnNone若使用find_spec,要注意此方法的调用需要带有两到三个参数。第一个是被导入模块的完整限定名称,例如foo.bar.baz。第二个参数是供模块搜索使用的路径条目。对于高层级模块,第二个参数为None,但对于子模块或子包,第二个参数为父包__path__属性的值。如果相应的__path__属性无法访问,将引发ModuleNotFoundError。第三个参数是一个将被作为稍后加载目标的现有模块对象。导入系统仅会在重加载期间传入一个目标模块。fromimportlibimportabcfromimportlib.machineryimportModuleSpecclassUrlMetaFinderabc.MetaPathFinderdef__init__self,basebself._baseb=basebdeffind_specself,fullname,path=None,target=NoneifpathisNonebaseb=self._basebelse#不是原定义的b就直接返回不存在ifnotpath.startswithself._basebreturnNonebaseb=pathtryloader=UrlMetaLoaderbasebreturnModuleSpecfullname,loader,is_package=loader.is_packagefullnameexceptExceptionreturnNone接下来是加载器由源码得知,路径查找器分为两种FileLoaderSourceLoader按理说,两种加载器都可以实现我们想要的功能,我这里选用SourceLoader来示范。在SourceLoader这个抽象类里,有几个很重要的方法,在你写实现加载器的时候需要注意get_code获取源代码,可以根据自己场景实现实现。exec_module执行源代码,并将变量赋值给module.dictget_data抽象方法,必须实现,返回指定路径的字节码。get_filename抽象方法,必须实现,返回文件名在一些老的博客文章中,你会经常看到加载器要实现load_module,而这个方法早已在Python.的时候就被废弃了,当然为了兼容考虑,你若使用load_module也是可以的。fromimportlibimportabcclassUrlMetaLoaderabc.SourceLoaderdef__init__self,basebself.baseb=basebdefget_codeself,fullnamef=blib.bopenself.get_filenamefullnamereturnf.readdefload_moduleself,fullnamecode=self.get_codefullnamemod=sys.modules.setdefaultfullname,imp.new_modulefullnamemod.__file__=self.get_filenamefullnamemod.__loader__=selfmod.__package__=fullnameexeccode,mod.__dict__returnNonedefget_dataselfpassdefexecute_moduleself,modulepassdefget_filenameself,fullnamereturnself.baseb+fullname+'.py'当你使用这种旧模式实现自己的加载时,你需要注意两点,很重要execute_module必须重载,而且不应该有任何逻辑,即使它并不是抽象方法。load_module,需要你在查找器里手动执行,才能实现模块的加载做为替换,你应该使用execute_module和create_module。由于基类里已经实现了execute_module和create_module,并且满足我们的使用场景。我这边可以不用重复实现。和旧模式相比,这里也不需要在设查找器里手动执行execute_module。importblib.requestasblibclassUrlMetaLoaderimportlib.abc.SourceLoaderdef__init__self,basebself.baseb=basebdefget_codeself,fullnamef=blib.bopenself.get_filenamefullnamereturnf.readdefget_dataselfpassdefget_filenameself,fullnamereturnself.baseb+fullname+'.py'查找器和加载器都有了,别忘了往sys.b_path注册我们自定义的查找器UrlMetaFinder。definstall_baddressfinder=UrlMetaFinderaddresssys.b_path.appendfinder所有的代码都解析完毕后,我们将其整理在一个模块my_importer.py中#my_importer.pyimportsysimportimportlibimportblib.requestasblibclassUrlMetaFinderimportlib.abc.MetaPathFinderdef__init__self,basebself._baseb=basebdeffind_moduleself,fullname,path=NoneifpathisNonebaseb=self._basebelse#不是原定义的b就直接返回不存在ifnotpath.startswithself._basebreturnNonebaseb=pathtryloader=UrlMetaLoaderbasebexceptExceptionreturnNoneclassUrlMetaLoaderimportlib.abc.SourceLoaderdef__init__self,basebself.baseb=basebdefget_codeself,fullnamef=blib.bopenself.get_filenamefullnamereturnf.readdefget_dataselfpassdefget_filenameself,fullnamereturnself.baseb+fullname+'.py'definstall_baddressfinder=UrlMetaFinderaddresssys.b_path.appendfinder.搭建远程服务端开始我说了,要实现一个远程导入模块的方法。我还缺一个在远端的服务器,来存放我的模块,为了方便,我使用python自带的http.server模块用一条命令即可实现。$mkdirhttpservercdhttpserver$catmy_info.pyEOFname='Python编程时光'print'ok'EOF$catmy_info.pyname='Python编程时光'print'ok'$$python-mhttp.server00ServingHTTPon0.0.0.0port00......一切准备好,我们就可以验证了。frommy_importerimportinstall_binstall_b'#往sys.b_path注册finderimportmy_info#打印ok,说明导入成功okmy_info.name#验证可以取得到变量'Python编程时光'至此,我实现了一个简易的可以导入远程服务器上的模块的导入器。.参考文档.//docs.python.org/zh-cn//library/importlib.html#module-importlib.abc.。
246457 远程I/O UR20-4DI-4DO-PN-FSPS-V2远程模块
199388 远程I/O UR20-4AI-UI-DIF-16-DIAG模块:http://www.jdzj.com/chanpin/ku1_4079653.html