https://github.com/gorakhargosh/watchdog/pull/225/filesは追加setsid
経由でコマンドを実行するときに呼び出しをauto-restart
。 このコマンドはOSXでは使用できません。
$ watchmedo auto-restart -- MY-COMMAND-HERE
Traceback (most recent call last):
File "/Users/nickolay/temp-env/bin/watchmedo", line 9, in <module>
load_entry_point('watchdog==0.8.3', 'console_scripts', 'watchmedo')()
File "/Users/nickolay/temp-env/lib/python2.7/site-packages/watchdog/watchmedo.py", line 566, in main
parser.dispatch()
File "/Users/nickolay/temp-env/lib/python2.7/site-packages/argh/helpers.py", line 55, in dispatch
return dispatch(self, *args, **kwargs)
File "/Users/nickolay/temp-env/lib/python2.7/site-packages/argh/dispatching.py", line 174, in dispatch
for line in lines:
File "/Users/nickolay/temp-env/lib/python2.7/site-packages/argh/dispatching.py", line 277, in _execute_command
for line in result:
File "/Users/nickolay/temp-env/lib/python2.7/site-packages/argh/dispatching.py", line 231, in _call
result = function(namespace_obj)
File "/Users/nickolay/temp-env/lib/python2.7/site-packages/watchdog/watchmedo.py", line 541, in auto_restart
handler.start()
File "/Users/nickolay/temp-env/lib/python2.7/site-packages/watchdog/tricks/__init__.py", line 147, in start
self.process = subprocess.Popen(self.command)
File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/subprocess.py", line 710, in __init__
errread, errwrite)
File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/subprocess.py", line 1335, in _execute_child
raise child_exception
OSError: [Errno 2] No such file or directory
https://docs.python.org/3/library/subprocess.htmlから判断すると
子の環境を変更する必要がある場合は、preexec_fnで行うのではなく、envパラメーターを使用してください。 start_new_sessionパラメーターは、以前に一般的に使用されていたpreexec_fnの代わりに、子でos.setsid()を呼び出すことができます。
...これは純粋なPythonで実行できる可能性があります(少なくともUnixでは)。 ウォッチドッグはPython2.6をサポートしているため、おそらくpreexec_fn
代わりにstart_new_session
preexec_fn
を使用する必要があります。
次の2つの場所でhttps://github.com/gorakhargosh/watchdog/blob/master/src/watchdog/tricks/__init__.py#L125を変更すると、OS X10.9.5で機能します。
< 141 self.command = ['setsid'] + command
> 141 self.command = command
146 def start(self):
< 147 self.process = subprocess.Popen(self.command, preexec_fn=os.setsid)
> 147 self.process = subprocess.Popen(self.command)
PR 225の元のケースではテストしなかったため、Windowsでは正しく機能しない可能性があります( os.setsid
はサポートされていないようで、 os.killpg
どのように機能するかわかりません)。
これはすでに#329で対処されています。
そうです、申し訳ありませんが、私がその問題をどのように見逃したのかわかりません。
Pythonパッケージはまだ更新されていません😭
はい、まだosxでこれを打っています
自動再起動はWindowsでも完全に壊れています。
os.setsidはそこでは利用できません。
ですから、同僚のためにこの問題を調べたときに、ほぼ1か月前の#329で自分の応答を見つけたので、次にこのページに出くわしたときに、それを修正するために何をしたかについて言及したいと思います。 ..
pip install git+https://github.com/gorakhargosh/watchdog.git
最も参考になるコメント
ですから、同僚のためにこの問題を調べたときに、ほぼ1か月前の#329で自分の応答を見つけたので、次にこのページに出くわしたときに、それを修正するために何をしたかについて言及したいと思います。 ..
pip install git+https://github.com/gorakhargosh/watchdog.git