我在已使用 NSSM 安装为 Windows 服务的 Python 脚本中拥有此功能。当 Python 脚本正常运行(即不作为服务)时,会打印该文件。但是,当它作为服务安装时,它不会打印。
打印命令由另一台设备通过 opc-ua 外部触发。
当脚本作为服务安装时,是否可以打印?当作为服务安装时,我也没有收到任何异常。有时我KeyboardInterrupt
在循环之间休眠时会收到异常。
还有其他方法可以通过 opc-ua 打印外部触发的文件吗?
我知道我可以在 Windows 任务调度程序中创建 20 个不同的触发器,这样每 5 秒就会执行一次并检查 opc-ua 变量。这似乎是一个非常繁琐的过程
以下是我的 Python 脚本的一部分:
def CheckOpcuaNode(latestPDF):
client = Client("opc.tcp://192.168.202.90:4840/")
try:
client.connect()
opcuaNode = client.get_node("ns=6;s=::AsGlobalPV:g_saveParameters.bPrintNow")
Result = opcuaNode.get_value()
if Result == True:
print("print file: %s" % str(latestPDF))
os.startfile(latestPDF, "print")
try:
time.sleep(4)
except KeyboardInterrupt: # Ignore keyborditerruption
print("ERROR KeyboardInterrupt while printing: %s" % sys.exc_info()[0])
opcuaNode.set_attribute(ua.AttributeIds.Value, ua.DataValue(False))
except:
print("ERROR while checking if PDF shall be printed: %s" % sys.exc_info()[0])
finally:
client.disconnect()
def LatestPdf():
return 'path\to\PDF\file.pdf'
if __name__ == '__main__':
while True:
latestPdfFile = LatestPdf()
if latestPdfFile != '':
CheckOpcuaNode(latestPdfFile) # check If PLC has asked to print pdf file
try:
time.sleep(4)
except KeyboardInterrupt: # Ignore keyborditerruption
print("ERROR KeyboardInterrupt between loops: %s" % sys.exc_info()[0])
答案1
Acrobat 打开一个窗口然后继续打印文件是您的问题。
服务通常无法访问图形环境。它们通常“非交互式“。
你可能想找一个命令行PDF打印工具或者直接从 Python 脚本打印。编程问题与此无关,因此我无法解决这个问题的特定方面(它属于堆栈溢出)。
答案2
- 在普通用户帐户下运行该服务
- 使用该用户帐户登录以打开 Adobe Reader 并接受 EULA(每个用户都需要执行此操作)和连接网络打印机(“本地系统帐户”无法实现),并将其设为默认打印机
故障排除:在脚本中调用“wmic 打印机列表简介 >> c:\serviceprinters.txt”以查看用户配置文件是否正确加载/网络打印机是否可用