跟进这个问题: 创建一个运行模块的 PyCharm 配置“python -m foo”
使用 2018.1 中的新选项,运行和调试模块对我来说非常有用,您现在可以为其指定要运行的模块。但是,分析相同的配置不起作用。
PyCharm 尝试运行这样的东西:
/path/to/python /path/to/pycharm/plugins/python/helpers/profiler/run_profiler.py 127.0.0.1 44725 -m mypackage.cli.runthis paramA paramB
Run Code Online (Sandbox Code Playgroud)
无论出于何种原因,所有参数(尤其是 -m)都转发到我的包,并且 argparse 抱怨它不知道 -m。正如我之前所说,此配置非常适合运行/调试。知道如何让分析器工作吗?
我目前正在将一个Python项目从Linux移植到Windows(使用Anaconda Python 3.6).一切都很完美,我无法正常退出asyncio循环工作.
在Linux中我正在做以下事情:
class GracefulExit(SystemExit):
code = 1
def raise_graceful_exit():
raise GracefulExit()
loop = asyncio.get_event_loop()
loop.add_signal_handler(signal.SIGINT, raise_graceful_exit)
loop.add_signal_handler(signal.SIGTERM, raise_graceful_exit)
try:
loop.run_forever()
except GracefulExit:
pass
shutdown()
Run Code Online (Sandbox Code Playgroud)
在Windows中,不幸的是我得到NotImplementedError的add_signal_handler.如果没有这个,我当然永远不会有机会彻底关闭程序.
关于如何解决这个问题的任何想法?谢谢.
我目前正在使用Python 3.5中的asyncio执行我的第一步,并且有一个问题困扰着我.显然我还没有完全理解协程......
这是我正在做的简化版本.
在我的类中,我有一个open()方法,可以创建一个新线程.在该线程中,我创建了一个新的事件循环和一些主机的套接字连接.然后我让循环永远运行.
def open(self):
# create thread
self.thread = threading.Thread(target=self._thread)
self.thread.start()
# wait for connection
while self.protocol is None:
time.sleep(0.1)
def _thread(self):
# create loop, connection and run forever
self.loop = asyncio.new_event_loop()
coro = self.loop.create_connection(lambda: MyProtocol(self.loop),
'somehost.com', 1234)
self.loop.run_until_complete(coro)
self.loop.run_forever()
Run Code Online (Sandbox Code Playgroud)
停止连接现在非常简单,我只是从主线程停止循环:
loop.call_soon_threadsafe(loop.stop)
Run Code Online (Sandbox Code Playgroud)
不幸的是我需要做一些清理工作,特别是在断开与服务器的连接之前我需要清空一个队列.所以我尝试了MyProtocol中的这个stop()方法:
class MyProtocol(asyncio.Protocol):
def __init__(self, loop):
self._loop = loop
self._queue = []
async def stop(self):
# wait for all queues to empty
while self._queue:
await asyncio.sleep(0.1)
# disconnect
self.close()
self._loop.stop()
Run Code Online (Sandbox Code Playgroud)
队列从协议的data_received()方法中清空,所以我只想等待使用带有asyncio.sleep()调用的while循环.然后我关闭连接并停止循环.
但是如何从主线程调用此方法并等待它?我尝试了以下,但它们似乎都没有工作(协议是当前使用的MyProtocol实例):
loop.call_soon_threadsafe(protocol.stop)
loop.call_soon_threadsafe(functools.partial(asyncio.ensure_future, protocol.stop(), loop=loop)) …Run Code Online (Sandbox Code Playgroud)