python3错误:无效模式%r“%模式,试图在os.popen中使用对象

问题描述 投票:0回答:1

我正在尝试从刚被解开的对象访问数据,并将其与]一起使用>

os.popen()

击中错误

Traceback (most recent call last):
  File "tmpclient4.py", line 46, in <module>
    stream = os.popen('%t.cmd', '%t.arg')
  File "/usr/lib/python3.8/os.py", line 978, in popen
    raise ValueError("invalid mode %r" % mode)
ValueError: invalid mode '%t.arg'

或错误:

ValueError: invalid mode 'htop' #my object value

使用中

stream = os.popen('%t.cmd', '%t.arg')

stream = os.popen(t.cmd, t.arg)

代码:

import socket
import pickle
import os

HEADERSIZE = 10

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(('192.168.42.14', 666))

class Zeroquery:
        # Initializer / Instance Attributes
        def __init__(self, cmd, arg):
                self.cmd = cmd
                self.arg = arg
while True:
        full_msg = b''
        new_msg = True
        while True:
                msg = s.recv(16)
                if new_msg:
                        print("new msg len:",msg[:HEADERSIZE])
                        msglen = int(msg[:HEADERSIZE])
                        new_msg = False

                print(f"full message length: {msglen}")

                full_msg += msg


                print(len(full_msg))

                if len(full_msg)-HEADERSIZE == msglen:
                        print("full msg recvd")
                        t = pickle.loads(full_msg[HEADERSIZE:])
                        print(t.cmd, t.arg)
                        if t.cmd:
                                stream = os.popen(t.cmd, t.arg)
                                output = stream.read()
                                print(output)
                        new_msg = True
                        full_msg = b""

如何使用对象数据使用os.popen?

我正在尝试从刚被解开的对象访问数据,并将其与os.popen()配合使用,从而导致错误回溯(最近一次调用是最近的):文件“ tmpclient4.py”,第[..行。 。

python python-3.x object subprocess pickle
1个回答
0
投票
或使用f字符串

cmd = f"{t.cmd} {t.arg}"

如果cmdarg是字符串,则可以这样做

cmd = " ".join([t.cmd, t.arg])

cmd = t.cmd + " " + t.arg

现在您可以将其用作第一个参数

os.popen(cmd)

编辑:

最终,您可以在__str__中创建方法Zeroquery

class Zeroquery: # Initializer / Instance Attributes def __init__(self, cmd, arg): self.cmd = cmd self.arg = arg def __str__(self): return self.cmd + " " + self.arg

然后您可以使用str(t)

os.popen( str(t) )

BTW:

[当Zeroquery具有__str__时,您可以打印它(即使没有str()

print( t )

print()将使用此__str__转换为字符串。
© www.soinside.com 2019 - 2024. All rights reserved.