万里晴空 发表于 2021-5-31 10:38:19

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

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

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

import os
import sys
import win32com.client

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


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

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

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

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

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

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

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


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


   




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


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

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




# Interop.LabelManager2 调用codesoft打印

import clr
import os
import sys

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

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

from LabelManager2 import *

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

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

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

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

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



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

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

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

万里晴空 发表于 2021-5-31 10:45:04

本帖最后由 万里晴空 于 2021-6-3 16:49 编辑

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


using System;
using System.Collections.Generic;
using System.Runtime.InteropServices;
using System.Text;
using System.Linq;
using LabelManager2;
using System.Diagnostics;

namespace CodeSoftPrintHelper
{
    public static class PrintHelper
    {
      private static string filePath = string.Empty;
      private static string printer = string.Empty;
      private static ApplicationClass app;
      private static Document doc;

      /// <summary>
      /// 打印标签
      /// </summary>
      /// <param name="FilePath">模板路径</param>
      /// <param name="Quantity">打印数量</param>
      /// <param name="Items">变量名和值的集合</param>
      /// <param name="ErrorMessage">异常信息</param>
      /// <returns>返回是否打印成功</returns>
      public static Tuple<bool, string> PrintLabel(string FilePath, string Printer, int Quantity, Dictionary<string, string> Items)
      {
            try
            {
               
                if (app == null)
                {
                  app = new ApplicationClass();
                  app.Options.Language = enumLanguage.lppxSimplifiedChinese;
                }

                if (filePath.Equals(FilePath)&&printer.Equals(Printer))
                {
                  foreach (var item in Items)
                  {
                        if (doc.Variables.Item(item.Key) != null)
                        {
                            doc.Variables.Item(item.Key).Value = item.Value;
                        }
                  }
                  var r = doc.PrintDocument(Quantity);
                  return new Tuple<bool, string>(true, string.Empty);
                }
                else
                {
                  app.Documents.Open(FilePath, false);
                  doc = app.ActiveDocument;
                  doc.Printer.SwitchTo(Printer);
                  filePath = FilePath;
                  foreach (var item in Items)
                  {
                        if (doc.Variables.Item(item.Key) != null)
                        {
                            doc.Variables.Item(item.Key).Value = item.Value;
                        }
                  }
                  var r = doc.PrintDocument(Quantity);
                  return new Tuple<bool, string>(true, string.Empty);
                }
            }
            catch (Exception ex)
            {
                return new Tuple<bool, string>(false, ex.Message);
            }
      }
    }
}

Dragon910623 发表于 2021-6-21 21:58:22

向大佬学习

超级玛尼哄 发表于 2021-6-23 15:31:05

{:10_279:}{:10_279:}

nahongyan1997 发表于 2021-6-23 21:07:22

为 python 写的 Cdll 需要按照 python 专用写法编写程序,不是原生的c程序拿来就能用的。

龙舞九天 发表于 2021-6-24 06:00:22

{:5_95:}

975050208@qq.co 发表于 2021-6-24 08:50:33

学习

ridiculum 发表于 2021-6-24 09:31:15

{:10_279:}

ridiculum 发表于 2021-6-24 09:32:27

学习一个

懒狗李 发表于 2021-6-24 10:39:22

{:10_282:}

一只团子 发表于 2021-6-24 13:39:35

{:10_254:}

世伊酱 发表于 2021-6-24 14:49:25

学习

975050208@qq.co 发表于 2021-6-25 10:31:43

{:5_108:}

万里晴空 发表于 2021-6-26 08:19:45

nahongyan1997 发表于 2021-6-23 21:07
为 python 写的 Cdll 需要按照 python 专用写法编写程序,不是原生的c程序拿来就能用的。

这个DLL是一个打印软件的调用文件具体用什么语言开发的不太清楚,之前是用C#调用开发来实现打印的,在学python所以想用python也调用这个文件来实现打印,您给看看是哪里问题。

975050208@qq.co 发表于 2021-6-26 08:20:03


学习一下

robinyunhao 发表于 2021-6-26 09:39:06


一只咸鱼123 发表于 2021-6-26 10:00:38

{:10_256:}

Dragon910623 发表于 2021-6-26 13:36:56

看看

超级玛尼哄 发表于 2021-6-27 00:05:09

{:10_254:}

超级玛尼哄 发表于 2021-6-27 00:05:43

{:10_254:}
页: [1] 2 3
查看完整版本: pythonnet库(clr)加载了dll文件后,为什么里面的内部函数变了无法调用?