Página 1 de 1

[RESUELTO] Paquete con requisito de ruta absoluta.

Publicado: 9 de junio de 2020 - 17:22
por LMS
Hola,

estoy dando seguimiento a mi primer mensaje: viewtopic.php?f=9&t=2389 , sobre la creación de una impresora.

El script sugerido por sfonteneau funciona. Sin embargo, no hay configuración y mi controlador, por defecto, elige un formato increíble (8.5 x 11").

Así que quería configurarlo, pero estos ajustes no están fácilmente disponibles (o simplemente no soy bueno buscando). Logré encontrar una solución exportando y luego importando una configuración usando el comando:
- RUNDLL32.EXE PRINTUI.DLL,PrintUIEntry /Ss /n "Schumann copier 5th floor" /a C:\A4-format.dat
- RUNDLL32.EXE PRINTUI.DLL,PrintUIEntry /Sr /n "Schumann copier 5th floor" /a C:\A4-format.dat
Edición: Nota: Por supuesto, solo realizo la exportación una vez, en una máquina que ya está configurada, para obtener la configuración básica. Luego intento reproducir la importación con /Sr usando un paquete.wapt.


Sin embargo, el comando solo funciona durante la importación cuando tenemos una ruta absoluta. La prueba a continuación me lleva a esto Conclusión:
Cuando estoy en mi símbolo del sistema en c:> y escribo la opción /a 'A4-format.dat', la operación falla y se detiene, pero con /a 'C:/A4-format.dat' funciona, y al comprobar las propiedades de la impresora, el formato efectivamente ha cambiado. El resultado es el mismo tanto si la ventana del símbolo del sistema se inicia como administrador como si no.

Mi pregunta es:
- ¿He entendido mal algo en la ejecución de printui.exe? ¿Tienen alguna documentación sobre cómo asignar directamente la configuración de la impresora, en lugar de depender de un archivo de configuración?
- Si entiendo correctamente, ¿qué solución debería recomendar? -
¿Hay una carpeta en el equipo cliente, para cada paquete wapt, a la que se podría apuntar con una ruta absoluta que, por lo tanto, no cambiaría para cada estación de trabajo?
- ¿Deberíamos usar un recurso compartido de red para almacenar los archivos fuente?
- ¿Otra solución? (Usar un comando para copiar el archivo fuente .dat a las estaciones de trabajo cliente, por ejemplo a c:/source_wapt/fichier.dat, luego establecer la nueva ruta absoluta, evitando así una configuración general, pero utilizando un script general.)

Re: Paquete que requiere ruta absoluta.

Publicado: 9 de junio de 2020 - 21:44
por dcardon
El paquete se descomprime en un directorio temporal con un nombre aleatorio. Puede recuperar la ruta del directorio donde se descomprimió usando la variable `basedir`.

Re: Paquete que requiere ruta absoluta.

Publicado: 11 de junio de 2020 - 11:06 a. m.
por LMS
Gracias, la variable basedir es genial.

Sin embargo, en última instancia, ese no parece ser el problema principal.

En mi script, que en gran parte tomé prestado de sfonteneau para la creación de la impresora, aquí están las dos líneas activas:

- Instalé la impresora "Schumann Copier 5th floor". Funciona sin problemas.
run(ur'rundll32 printui.dll,PrintUIEntry /if /b "%s" /f %s /r "IP_%s" /m "%s" ' % (nombreimpresora,ruta_controlador,puertoimprimir,nombre_controladores))

Se supone que importa la configuración de impresora "printer-format.dat" a la fotocopiadora/impresora Schumann. No funciona desde PyScripter.
run(u'printui.exe /Sr /n "Copiadora Schumann 5.º piso" /a /f %s\printer-format.dat' %(basedir))
Así que probé con /f, que no cambió nada, y agregué la ruta completa con basedir. Nada cambió.

Sin embargo, como recordatorio, no hay ningún problema al usar CMD directamente, con los mismos archivos y las mismas rutas. O mejor dicho, no del todo:
Cuando compilo el paquete y lo subo a mi repositorio local, intento modificarlo y ejecuto un comando en el archivo printer-format.dat, aparece el mensaje "no se pudo completar la operación" (para la importación). Así que exporto para sobrescribir el archivo, lo importo de nuevo y funciona.

Tengo la sensación de que esto podría estar relacionado con un problema de seguridad de Windows. He encontrado muchos errores similares al crear mis paquetes. A veces encuentro soluciones alternativas que parecen más trucos (usando archivos por lotes o PowerShell) que soluciones legítimas.

En resumen, estoy dando vueltas y no entiendo los códigos de error que me devuelven. ¿Tienes algún consejo para mejorar mi comprensión?
Para su información, aquí está mi función de instalación:

Código: Seleccionar todo

def install():

    if iswin64():
        path_driver = r"IT5DSETWin_10110FR\Drivers\PCL6\Win_x64\KOAXTJ__.INF"
        name_drivers = "KONICA MINOLTA C287SeriesPCL"
    else:
        path_driver = r"IT5DSETWin_10110FR\Drivers\PCL6\Win_x86\KOAXTJ__.inf"
        name_drivers = "KONICA MINOLTA C287SeriesPCL"



    # Delete old printer
    run_notfatal('rundll32 printui.dll,PrintUIEntry /n "%s" /dl /q ' % nameprinter)

    # Create port lpr or raw
    createprinterport_raw(portprint)

    # use create lpr if needed
    #createprinterport_lpr(portprint,'qu')

    # Install printer and drivers
    run(ur'rundll32 printui.dll,PrintUIEntry /if /b "%s" /f %s /r  "IP_%s" /m "%s" ' % (nameprinter,path_driver,portprint,name_drivers))

    run(u'printui.exe /Sr /n "Copieur schumann 5eme etage" /a /f %s\printer-format.dat' %(basedir))
Aquí está el código de error cuando ejecuto un comando "instalar" en PyScripter:

Código: Seleccionar todo

2020-06-11 10:51:51,466 CRITICAL Fatal error in install script: CalledProcessErrorOutput: Command 'printui.exe /Sr /n "Copieur schumann 5eme etage" /a /f c:\\waptdev\\wapt_av-5thFloor-printer-wapt\\printer-format.dat' returned non-zero exit status 1.
Output::
Traceback (most recent call last):
  File "C:\Program Files (x86)\wapt\common.py", line 3800, in install_wapt
    exitstatus = setup.install()
  File "c:\waptdev\wapt_av-5thFloor-printer-wapt\setup.py", line 36, in install
    run(u'printui.exe /Sr /n "Copieur schumann 5eme etage" /a /f %s\printer-format.dat' %(basedir))
  File "C:\Program Files (x86)\wapt\common.py", line 3570, in run
    return ensure_unicode(setuphelpers.run(*arg,**args))
  File "C:\Program Files (x86)\wapt\setuphelpers_windows.py", line 3863, in run
    raise CalledProcessErrorOutput(proc.returncode,cmd,''.join(output))
CalledProcessErrorOutput: Command 'printui.exe /Sr /n "Copieur schumann 5eme etage" /a /f c:\\waptdev\\wapt_av-5thFloor-printer-wapt\\printer-format.dat' returned non-zero exit status 1.
Output:

FATAL ERROR : CalledProcessErrorOutput: Command 'printui.exe /Sr /n "Copieur schumann 5eme etage" /a /f c:\\waptdev\\wapt_av-5thFloor-printer-wapt\\printer-format.dat' returned non-zero exit status 1.
Output:
Exit code:  3
Si no sabes qué información podría ser realmente importante para ti, no dudes en preguntarme si lo necesitas. Ya publico mucho y no quiero desanimar a quienes podrían querer leer mis publicaciones.

Re: Paquete que requiere ruta absoluta.

Publicado: 11 de junio de 2020 - 13:43
por sfonteneau
para el pedido

Código: Seleccionar todo

run(ur'printui.exe /Sr /n "Copieur schumann 5eme etage" /a /f %s\printer-format.dat' %(basedir))
¿Quizás sea necesario ejecutarlo en el contexto del usuario? con configuración de sesión

Re: Paquete que requiere ruta absoluta.

Publicado: 11 de junio de 2020 - 15:59
por LMS
¡La configuración de la sesión es útil! Esto demuestra que necesito explorar un poco más todo lo que wapt puede hacer por mí.

En este caso, estaba relacionado, pero no directamente. Es el ejecutable printui el que establece directamente el contexto; podemos modificarlo con indicadores al final del archivo de configuración importado. Así que aquí está la nueva línea que funciona en el contexto del usuario y se ejecuta correctamente desde "def install:"

Código: Seleccionar todo

run(ur'printui.exe /Sr /n "Copieur schumann 5eme etage" /a %s\printer-format.dat u' %(basedir))
Y, de hecho, para ir más allá, me iba a encontrar con un problema: mi importación no contendría datos formateados, porque se necesitan indicadores para especificar qué se quiere exportar. Así que hay que exportar con:

Código: Seleccionar todo

Rundll32.exe printui.dll,PrintUIEntry /Ss /n "Copieur Schumann 5eme etage" /a printer-format.dat c m u
Y importar con:

Código: Seleccionar todo

run(ur'Rundll32.exe printui.dll,PrintUIEntry /Sr /n "Copieur Schumann 5eme etage" /a %s\printer-format.dat c m p r u' %(basedir))
Lo importante es exportar e importar con la "u" para utilizar el mismo contexto.

Aquí está el tema que me ayudó:
https://stackoverflow.com/questions/173 ... completado-e

Re: Paquete que requiere ruta absoluta.

Publicado: 11 de junio de 2020 - 16:16
por sfonteneau
¡Muchas gracias! ¡De mucha ayuda!

Re: [RESUELTO] Paquete que requiere ruta absoluta.

Publicado: 12 de enero de 2021 - 17:29
por rmaurisso
Buen día,
Gracias por el código para implementar y configurar las impresoras.
La implementación funciona bien, pero en Pyscripter cuando inicio la instalación para probar, la configuración de la impresora solo funciona para mi cuenta de administrador de dominio (dominio samba de anuncios).
Sin embargo, si ejecuto manualmente la siguiente línea de comando en la sesión del usuario usando cmd

Código: Seleccionar todo

RUNDLL32 PRINTUI.DLL,PrintUIEntry /Sr /n "Copieur Administratif Etage" /a C:\waptdev\tis-install-printer-Administratif_Etage-wapt\disk1\config-CAE.dat u
La configuración se aplica correctamente para mi usuario.
¿Es posible que haya pasado por alto una configuración que hace que la implementación de la impresora funcione pero no la configuración para los usuarios?
Gracias por tus comentarios

Re: [RESUELTO] Paquete que requiere ruta absoluta.

Publicado: 13 de enero de 2021 - 11:25 a. m.
por rmaurisso
Funciona con el contexto de usuario session_setup :D
. ¡Genial! :mrgreen: