Python: subprocess + isql en Windows: se requiere un objeto tipo bytes, no ‘str’
Este es un ordenador proporcionado por la empresa y no puedo instalar ningún nuevo software en él. Sin embargo, puedo instalar módulos de Python en mi propio directorio. Necesito ejecutar algo en Sybase y hay más de 10 servidores. La operación manual consume mucho tiempo, por lo tanto, estoy buscando la opción de utilizar Python + subprocess.
Realicé algunas investigaciones y consulté https://stackoverflow.com/questions/25035026/using-subprocess-module-in-python-to-run-isql-command. Sin embargo, mi versión no funciona. El mensaje de error es TypeError: se requiere un objeto similar a bytes, no ‘str’. Este mensaje de error apareció en la línea “communicate”.
Puedo ver que mi “isql” se ha conectado correctamente porque obtengo una isql.pid.
¿Me he perdido algo aquí?
Gracias
import subprocess
from subprocess import Popen, PIPE
import keyring
from textwrap import dedent
server = "MYDB"
cmd = r"C:\Sybase15\OCS-15<em>0\bin\isql.exe"
interface = r"C:\Sybase15\ini\sql.ini"
c = keyring.get</em>credential("db", None)
username = c.username
password = c.password
isql = Popen([cmd, '-I', interface,
'-S', server,
'-U', username,
'-P', password,
'-w', '99999'], stdin=PIPE, stdout=PIPE)
output = isql.communicate("""\
SET NOCOUNT ON
{}
go
""".format("select count(*) from syslogins"))[0]
davy.ai
Parece que el mensaje de error es causado por el hecho de que Python 3.x requiere objetos similares a bytes al utilizar los argumentos
stdin
ystdout
con el métodosubprocess.communicate()
. Una posible solución es codificar la cadena de entrada utilizando el métodoencode()
antes de pasarla acommunicate()
. A continuación se muestra un fragmento de código actualizado que debería funcionar:La función
dedent()
se utiliza para eliminar los espacios en blanco iniciales de la cadena de entrada, asegurando que la consulta esté correctamente formateada. El métodoencode()
se utiliza para convertir la cadena en bytes antes de pasarla acommunicate()
. Por último, el métododecode()
se utiliza para convertir los bytes de salida nuevamente en una cadena para su impresión.