我有Black Hat Python书中的以下代码,但是它不起作用,我也不知道为什么。
def client_handler(client_socket):
global command
...
if command:
while True:
client_socket.send('<ncreplace:#> '.encode('utf-8'))
cmd_buffer = ''
while '\n' not in cmd_buffer:
cmd_buffer += str(client_socket.recv(1024))
print('loop')
response = run_cmd(cmd_buffer)
client_socket.send(response.encode('utf-8'))
def run_cmd(command):
print('command')
command = command.strip()
try:
output = subprocess.check_output(command, stderr=subprocess.STDOUT, shell=True)
except:
output = 'Failed to execute command.\r\n'
return output
问题是:当我运行所有程序(应该是一些客户端服务器应用程序,并且该程序应该在服务器端运行)时,当执行cliend_handler方法时,它不会调用run_cmd方法。它仅打印“循环”一次,但不打印“命令”(我已将这些打印语句用于调试)。有人可以告诉我为什么吗?
答案 0 :(得分:1)
这是您的问题,或者至少是一个问题,导致该代码无法正常工作:
@FXML
TableView<Client> selectClientTable;
@FXML
TableColumn<Client, String> CodeC, NomC, RegCommerceC, IdFiscalC, NArtFisC;
@FXML
Button selectClientButton, returnSelectClientButton;
ObservableList<Clients> mylist = FXCollections.observableArrayList();
@Override
public void initialize(URL location, ResourceBundle resources) {
populateTable();
}
void populateTable() {
mylist.addAll(clientsArray);
CodeC.setCellValueFactory(c -> new SimpleStringProperty(String.valueOf(c.getValue().getCodeC())));
NomC.setCellValueFactory(c -> new SimpleStringProperty(c.getValue().getNomC()));
RegCommerceC.setCellValueFactory(c -> new SimpleStringProperty(c.getValue().getRegCom()));
IdFiscalC.setCellValueFactory(c -> new SimpleStringProperty(c.getValue().getIdFiscal()));
NArtFisC.setCellValueFactory(c -> new SimpleStringProperty(c.getValue().getnArticleFiscal()));
for (Clients client : clientsArray) {
System.out.println(String.valueOf(client.getCodeC()) + client.getNomC() + client.getRegCom() + client.getIdFiscal() + client.getnArticleFiscal());
}
selectClientTable.setItems(mylist);
}
假设这是Python 3,while '\n' not in cmd_buffer:
cmd_buffer += str(client_socket.recv(1024))
返回一个recv
。大概包含UTF-8编码的文本。您需要解码。您可以通过调用bytes
而不是decode
来实现。 str
所做的只是这里的错误。例如:
str
您不希望该>>> b = b'abc'
>>> print(b.decode())
abc
>>> print(str(b))
b'abc'
或那些b
个字符。
更重要的是,看看换行符的作用:
'
它将每个换行符转义为反斜杠和n。因此,当您一遍又一遍地询问缓冲区中是否有换行符时,永远不会有换行符。
如果此代码是为Python 2编写的,并且最初没有进行>>> b = b'abc\ndef\n'
>>> print(b.decode())
abc
def
>>> print(str(b))
b'abc\ndef\n'
调用,那么将Python 2代码移植到Python 3可能会比仅随机抛出str
更加棘手。和str
调用,直到您停止获取异常为止。这些文档具有a chapter on porting Python 2 to 3,尽管它实际上是为精通Python 2的人们准备的,所以您可能需要搜索The Conservative Python 3 Porting Guide之类的第三方教程。 (我不知道这是不是特别好,这只是搜索中出现的第一件事,但看起来不错,并且至少涵盖了如何使用bytes
和modernize
向导没有,至少我上次看过。)