V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX  ›  1462326016  ›  全部回复第 9 页 / 共 9 页
回复总数  174
1  2  3  4  5  6  7  8  9  
2019-07-15 20:07:15 +08:00
回复了 peanuts7660 创建的主题 Python 请教下 Python 在 windows 上执行命令行的问题
理论上来说你这样的话 B 就是 A 的子进程了,除非 B 退出了,否则你这种情况下应该不能单独退出 A 让 B 单独运行。
啊,格式乱了,不知道怎么格式化成 markdown。。。无语。
感谢大家的帮助,改成全双工已经没有问题了。
```
# -*- coding: utf-8 -*-
import asyncio
from struct import unpack, pack


async def handle_echo(reader, writer):
data = await reader.read(1024 * 64)
addr = writer.get_extra_info('peername')
print(f"connect from {addr!r}")
if len(data) < 3:
print('too short...')
writer.close()
return
result = unpack('!BBB', data[:3])
writer.write(b'\x05\x00')
await writer.drain()
data = await reader.read(1024 * 64)
result = unpack('!4B', data[:4])
if result[0] == 5 and result[1] == 1 and result[3] == 3:
host_len = unpack('!B', data[4:5])[0]
host = data[5:host_len + 5].decode()
port = unpack('!H', data[host_len + 5:])[0]
print(f'len {host_len},host {host},port {port}')
try:
reader_remote, writer_remote = await asyncio.open_connection(host, port)
writer.write(pack('!5B', 5, 0, 0, 3, host_len) + host.encode() + pack('!H', port))
await writer.drain()
print(f'connect success !{host}')
except (TimeoutError, ConnectionRefusedError) as _:
print(f'connect failed !{host}')
writer.write(pack('!5B', 5, 3, 0, 3, host_len) + host.encode() + pack('!H', port))
await writer.drain()
writer.close()
return
up_stream = _pipe(reader, writer_remote, host)
down_stream = _pipe(reader_remote, writer, host)
await asyncio.gather(up_stream, down_stream)
if result[0] == 5 and result[1] == 1 and result[3] == 1:
ip = '.'.join([str(a) for a in unpack('!BBBB', data[4:8])])
port = unpack('H', data[8:10])[0]
print(f'ip {ip},port {port}')
try:
reader_remote, writer_remote = await asyncio.open_connection(ip, port)
writer.write(pack('!8B', 5, 0, 0, 1, *unpack('!BBBB', data[4:8])) + pack('!H', port))
await writer.drain()
print(f'connect success !{ip}')
except (TimeoutError, ConnectionRefusedError) as _:
print(f'connect failed !{ip},{repr(_)}')
writer.write(pack('!8B', 5, 3, 0, 1, *unpack('!BBBB', data[4:8])) + pack('!H', port))
await writer.drain()
writer.close()
return
up_stream = _pipe(reader, writer_remote, ip)
down_stream = _pipe(reader_remote, writer, ip)
await asyncio.gather(up_stream, down_stream)


async def _pipe(reader, writer, host):
while reader.at_eof:
try:
data = await reader.read(1024 * 64)
if not data:
writer.close()
break
except (ConnectionAbortedError, ConnectionResetError) as _:
writer.close()
print(f'{host} 异常退出 {repr(_)}')
break
try:
writer.write(data)
await writer.drain()
except (ConnectionAbortedError, ConnectionResetError) as _:
writer.close()
print(f'{host} 异常退出 {repr(_)}')
break
print(f'{host} 退出')


async def main():
server = await asyncio.start_server(
handle_echo, '0.0.0.0', 3333)

addr = server.sockets[0].getsockname()
print(f'Serving on {addr}')

async with server:
await server.serve_forever()


loop = asyncio.get_event_loop()
loop.run_until_complete(asyncio.gather(main()))

```
代码在此
2019-06-28 11:53:49 +08:00
回复了 woshichuanqilz 创建的主题 Python 求助 pywintypes.com_error: (-2147221005, '无效的类字符串'... 问题
@woshichuanqilz 我直接百度了一个,SAPI.SpVoice 以这个为关键字搜索的一个 zip 文件,然后注册了直接就可以调用了
2019-06-28 09:06:06 +08:00
回复了 oldbird 创建的主题 Python shutil 复制会在本地做缓存?
def copyfileobj(fsrc, fdst, length=16*1024):
"""copy data from file-like object fsrc to file-like object fdst"""
while 1:
buf = fsrc.read(length)
if not buf:
break
fdst.write(buf)

看源代码的话目测是的
请善用预览功能,否则回答问题的成本太大
2019-06-28 08:56:34 +08:00
回复了 woshichuanqilz 创建的主题 Python 求助 pywintypes.com_error: (-2147221005, '无效的类字符串'... 问题
亲测 Python3.6.7 32 位,网上下载了 dll 文件,然后注册了 dll,复制你的代码完美运行。
没有安装你提供的那个 sdk,没有安装你的 pytts3,完美运行,你可以参考下,是不是你安装的版本什么的不对。
@XiaoxiaoPu 我参考一下,尝试下全双工的写法, 感谢
@2pang 了解了,感谢提醒,我尝试下全双工的写法。
@exch4nge 好的好的, 非常感谢, 我尝试一下
@exch4nge 数据大小的话可以看 stackoverflow 里边贴的日志,我打印了数据大小,没有超出。。我怀疑是不是没有全部发送出去,像之前的 sock.send 和 sock.sendall 的区别。
@lcdtyph 但是远程我在上面只是进行了 tcp 连接,没有其他操作,应该不会是远程先发数据
@qizheshang 这个是 Python3.7 新添加的函数,跑不通的话可以用
```loop = asyncio.get_event_loop()
loop.run_until_complete(asyncio.gather(main()))```
这个
2019-04-02 09:23:14 +08:00
回复了 yth492300648 创建的主题 Python pychram 能不能自动重启报错的 py 文件
可能你需要 supervisor 来启动 Python 进程,可以在意外退出的情况下自动重启
附送 github 链接: https://github.com/Supervisor/supervisor
1  2  3  4  5  6  7  8  9  
关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2684 人在线   最高记录 6679   ·     Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 · 16ms · UTC 05:31 · PVG 13:31 · LAX 21:31 · JFK 00:31
Developed with CodeLauncher
♥ Do have faith in what you're doing.