es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Error en la función subprocess.Popen process.communicate()

Intenté esta solución para resolver mi problema, pero cuando usé la solución obtuve este error:

Traceback (most recent call last):
  File "version_build.py", line 125, in <module>
    if __name__=='__main__': main()
  File "version_build.py", line 113, in main
    change = p4change(p4)
  File "version_build.py", line 90, in p4change
    change = p.communicate(changespec)[0]
  File "C:\Python36\Lib\subprocess.py", line 843, in communicate
    stdout, stderr = self._communicate(input, endtime, timeout)
  File "C:\Python36\Lib\subprocess.py", line 1086, in _communicate
    self._stdin_write(input)
  File "C:\Python36\Lib\subprocess.py", line 781, in _stdin_write
    self.stdin.write(input)
TypeError: se requiere un objeto similar a bytes, no 'str'

Mi pregunta principal es: ¿Por qué estoy obteniendo este error? ¿Estoy omitiendo algo de la solución dada en la otra pregunta?

Estoy usando Python3. He intentado usar la función str.encode(), pero al imprimir la variable en la consola, está vacía (b'').

Aquí están las líneas en las que está fallando (principalmente la línea de p.communicate):

“`
changespec = 'change: new\n' + description

p = subprocess.Popen([p4, 'change', '-i'], stdin=subprocess.PIPE, stdout=subprocess.PIPE)
change = p.communicate(changespec)[0]
return change
“`

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    El mensaje de error indica que se requiere un objeto de tipo bytes en lugar de una cadena. Esto sugiere que la entrada que se está pasando al subprocess no está codificada como bytes. Para resolver este problema, puedes utilizar el método encode() de la cadena para obtener la representación en bytes de la cadena. En el fragmento de código proporcionado, puedes modificar la variable changespec para que se codifique de la siguiente manera:

    changespec = b'change: new\n' + description.encode()
    

    Esto codificará la cadena de descripción como bytes y la concatenará con el literal de bytes change: new\n. Con esta modificación, el código debería funcionar como se espera.

Comments are closed.