鱼C论坛

 找回密码
 立即注册
查看: 7784|回复: 52

pythonnet库(clr)加载了dll文件后,为什么里面的内部函数变了无法调用?

[复制链接]
回帖奖励 73 鱼币 回复本帖可获得 1 鱼币奖励! 每人限 1 次(中奖概率 70%)
发表于 2021-5-31 10:38:19 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 万里晴空 于 2021-7-2 20:50 编辑

------------------------------------------------通过自己的努力找到其它方法解决------------------------------------------------------------------------------------
  1. # 先安装 codesoft 程序
  2. # 然后找到 安装pywin32包,然后通过python根目录包文件夹中找到win32com->client->运行makepy.py文件,点击对应codesoft程序
  3. # 生成com组件对接文件,然后在对接文件中查看最后一个类的调用注释说明,找到调用时用到的com组件名
  4. # 然后import win32com.client,然后用win32com.client.Dispatch("Codesoft.Application")创建对象
  5. # 可以正常调用了

  6. import os
  7. import sys
  8. import win32com.client

  9. currentFolder = os.getcwd()  # 获取当前路径,
  10. sys.path.append(currentFolder)  # 加载当前路径, 否则clr.AddReference("BarTender")会报找不到文件


  11. def PrintLAB(printer, printCount, filePath, items):
  12.     """调用CodeSoft打印标签,通过调用com组件实现"""
  13.     "printer-打印机名"
  14.     "printCount-打印份数"
  15.     "filePath-打印模版路径"
  16.     "items-变量字典集"
  17.     try:
  18.         # 创建  Application

  19.         csApp = win32com.client.Dispatch("Codesoft.Application")

  20.         # 模版路径
  21.         labfilename = filePath  # currentFolder + "\\333.lab"

  22.         # 打开标签模板文件
  23.         csApp.Document.Open(labfilename, False)

  24.         # 激活加载的文档
  25.         doc = csApp.ActiveDocument

  26.         # 设置打印机名
  27.         doc.SelectPrinter(printer)

  28.         # 模版文件的变量中传值
  29.         try:
  30.             # print(doc.Variables.Count)   # 模板文件中变量个数统计
  31.             # doc.Variables.Item(item).Value = items[item]  # 方法已被__getitem__替代
  32.             for key in items.keys():
  33.                 if doc.Variables.__getitem__(key):
  34.                     doc.Variables.__getitem__(key).Value = items[key]   # 向模版变量中添加变量值
  35.         except Exception as e:
  36.             return e
  37.         else:
  38.             # 设置打印张数
  39.             doc.Print(printCount)    # 打印份数执行后自动开始打印
  40.         finally:
  41.             doc.Close                # 关闭当前文档
  42.             csApp.Quit               # 退出当前应用
  43.             return True, None
  44.     except Exception as e:
  45.         return False, e.args


  46. if __name__ == "__main__":
  47.     items = {'IMEI1': '11111', 'IMEI3': '22222', 'VC': '33333'}
  48.     PrintLAB('Doro PDF Writer', '1', r'C:\Users\Administrator\Desktop\python file\开发文档\打印\001\111.Lab', items)


  49.    
复制代码




----------------------------------------------下面的问题如果有方法的依然可以回复------------------------------------------------------------------------------


我用pythonnet库(CLR)加载了DLL文件后,里面的类都可以正常加载,但在调用其中一个方法时报错{AttributeError: '__ComObject' object has no attribute 'Open'}
请诸位兄弟帮忙看下要怎么处理,附件为调用的DLL文件和报错图,如下代码是执行的源码。我试过用ctypes加载但好像识别不了,只有clr库可以识别,但在执行这个方法时报错,我用C#调用这个方法时是正常的。

报错的代码是加双----线的那段




  1. # Interop.LabelManager2 调用codesoft打印

  2. import clr
  3. import os
  4. import sys

  5. currentFolder = os.getcwd()  # 获取当前路径,
  6. sys.path.append(currentFolder)  # 加载当前路径, 否则clr.AddReference("LabelManager2")会报找不到文件
  7. clr.AddReference("LabelManager2")  # 这里不需要 .dll 后缀

  8. # 载入一堆要用到的东西,也可以直接 from LabelManager2 import *
  9. # 下面这句话不能写入函数里

  10. from LabelManager2 import *

  11. def printLAB(printer, printCount, filePath, items):
  12.     """调用codesoft打印标签"""
  13.     "printer--打印机名"
  14.     "printCount--打印份数"
  15.     "filePath--打印模版路径"
  16.     "items--变量字典集"
  17.    
  18.     # 创建 LabelManager2 的 Application
  19.     csApp = ApplicationClass()

  20.     # csApp.Options.Language = cs.enumLanguage.lppxSimplifiedChinese

  21.     # 打开标签模板文件
  22.     labfilename = filePath  # currentFolder + "\\333.lab"

  23.     # --------------------------------------------------------------------------------
  24.     csApp.Documents.Open(labfilename, False)    # 打开加载模版文件
  25.     # ---------------------------------------------------------------------------------
  26.     doc = csApp.ActiveDocument                  # 激活文件
  27.    

  28.     # 设置打印机
  29.     doc.Printer.SwitchTo(printer)  # "POSTEK TX6 (副本 1)"



  30.     for var,item in items:
  31.         if doc.Variables.Item(item.Key) is not None:
  32.             doc.Variables.Item(item.Key).Value = item.Value

  33.     # 设置打印张数
  34.     r = doc.PrintDocument(printCount)

  35.      
  36. if __name__ == "__main__":
  37.     items = {'IMEI1': '11111', 'IMEI2': '22222', 'VC': '33333'}  # 变量字典集
  38.     printLAB('POSTEK TX6 (副本 1)', '1', r'E:\ClearSky\C Programs\python\BTW\111.Lab', items)
复制代码
1622428413(1).jpg

调用打印模版信息.zip

1.11 KB, 下载次数: 11

111.zip

3.07 KB, 下载次数: 5

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-5-31 10:45:04 | 显示全部楼层
本帖最后由 万里晴空 于 2021-6-3 16:49 编辑

主题上传的图中双分割线-------标示的是报错的那段代码,
下图是用C#调用正常的图片如下图 1622429057(1).jpg


  1. using System;
  2. using System.Collections.Generic;
  3. using System.Runtime.InteropServices;
  4. using System.Text;
  5. using System.Linq;
  6. using LabelManager2;
  7. using System.Diagnostics;

  8. namespace CodeSoftPrintHelper
  9. {
  10.     public static class PrintHelper
  11.     {
  12.         private static string filePath = string.Empty;
  13.         private static string printer = string.Empty;
  14.         private static ApplicationClass app;
  15.         private static Document doc;

  16.         /// <summary>
  17.         /// 打印标签
  18.         /// </summary>
  19.         /// <param name="FilePath">模板路径</param>
  20.         /// <param name="Quantity">打印数量</param>
  21.         /// <param name="Items">变量名和值的集合</param>
  22.         /// <param name="ErrorMessage">异常信息</param>
  23.         /// <returns>返回是否打印成功</returns>
  24.         public static Tuple<bool, string> PrintLabel(string FilePath, string Printer, int Quantity, Dictionary<string, string> Items)
  25.         {
  26.             try
  27.             {
  28.                
  29.                 if (app == null)
  30.                 {
  31.                     app = new ApplicationClass();
  32.                     app.Options.Language = enumLanguage.lppxSimplifiedChinese;
  33.                 }

  34.                 if (filePath.Equals(FilePath)&&printer.Equals(Printer))
  35.                 {
  36.                     foreach (var item in Items)
  37.                     {
  38.                         if (doc.Variables.Item(item.Key) != null)
  39.                         {
  40.                             doc.Variables.Item(item.Key).Value = item.Value;
  41.                         }
  42.                     }
  43.                     var r = doc.PrintDocument(Quantity);
  44.                     return new Tuple<bool, string>(true, string.Empty);
  45.                 }
  46.                 else
  47.                 {
  48.                     app.Documents.Open(FilePath, false);
  49.                     doc = app.ActiveDocument;
  50.                     doc.Printer.SwitchTo(Printer);
  51.                     filePath = FilePath;
  52.                     foreach (var item in Items)
  53.                     {
  54.                         if (doc.Variables.Item(item.Key) != null)
  55.                         {
  56.                             doc.Variables.Item(item.Key).Value = item.Value;
  57.                         }
  58.                     }
  59.                     var r = doc.PrintDocument(Quantity);
  60.                     return new Tuple<bool, string>(true, string.Empty);
  61.                 }
  62.             }
  63.             catch (Exception ex)
  64.             {
  65.                 return new Tuple<bool, string>(false, ex.Message);
  66.             }
  67.         }
  68.     }
  69. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-6-21 21:58:22 | 显示全部楼层
向大佬学习
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-6-23 15:31:05 | 显示全部楼层

回帖奖励 +1 鱼币

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-6-23 21:07:22 | 显示全部楼层
为 python 写的 Cdll 需要按照 python 专用写法编写程序,不是原生的c程序拿来就能用的。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-6-24 06:00:22 | 显示全部楼层

回帖奖励 +1 鱼币

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-6-24 08:50:33 | 显示全部楼层

回帖奖励 +1 鱼币

学习
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-6-24 09:31:15 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-6-24 09:32:27 | 显示全部楼层

回帖奖励 +1 鱼币

学习一个
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-6-24 10:39:22 | 显示全部楼层

回帖奖励 +1 鱼币

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-6-24 13:39:35 | 显示全部楼层

回帖奖励 +1 鱼币

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-6-24 14:49:25 | 显示全部楼层
学习
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-6-25 10:31:43 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-6-26 08:19:45 | 显示全部楼层
nahongyan1997 发表于 2021-6-23 21:07
为 python 写的 Cdll 需要按照 python 专用写法编写程序,不是原生的c程序拿来就能用的。

这个DLL是一个打印软件的调用文件具体用什么语言开发的不太清楚,之前是用C#调用开发来实现打印的,在学python所以想用python也调用这个文件来实现打印,您给看看是哪里问题。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-6-26 08:20:03 | 显示全部楼层

学习一下
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-6-26 09:39:06 | 显示全部楼层

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-6-26 10:00:38 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-6-26 13:36:56 | 显示全部楼层
看看
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-6-27 00:05:09 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-6-27 00:05:43 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-26 23:15

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表