将使用invoke (v 0.21)编写的任务从 *nix 移植到 Windows。任何使用都会ctx.run导致异常。
任务.py:
from invoke import task
@task
def hello(ctx):
ctx.run('echo Hello')
Git bash 和 cmd.exe 的结果是一样的:
C:\...>invoke hello
Traceback (most recent call last):
File "c:\python36\lib\runpy.py", line 193, in _run_module_as_main
"__main__", mod_spec)
File "c:\python36\lib\runpy.py", line 85, in _run_code
exec(code, run_globals)
File "C:\Python36\Scripts\invoke.exe\__main__.py", line 9, in <module>
File "c:\python36\lib\site-packages\invoke\program.py", line 293, in run
self.execute()
File "c:\python36\lib\site-packages\invoke\program.py", line 414, in execute
executor.execute(*self.tasks)
File "c:\python36\lib\site-packages\invoke\executor.py", line 129, in execute
result = call.task(*args, **call.kwargs)
File "c:\python36\lib\site-packages\invoke\tasks.py", line 115, in __call__
result = self.body(*args, **kwargs)
File "C:\...\tasks.py", line 5, in hello
ctx.run('echo Hello')
File "c:\python36\lib\site-packages\invoke\context.py", line 82, in run
return self._run(runner, command, **kwargs)
File "c:\python36\lib\site-packages\invoke\context.py", line 89, in _run
return runner.run(command, **kwargs)
File "c:\python36\lib\site-packages\invoke\runners.py", line 262, in run
return self._run_body(command, **kwargs)
File "c:\python36\lib\site-packages\invoke\runners.py", line 276, in _run_body
self.start(command, shell, env)
File "c:\python36\lib\site-packages\invoke\runners.py", line 981, in start
stdin=PIPE,
File "c:\python36\lib\subprocess.py", line 707, in __init__
restore_signals, start_new_session)
File "c:\python36\lib\subprocess.py", line 992, in _execute_child
startupinfo)
FileNotFoundError: [WinError 3] The system cannot find the path specified
虽然没有这样的错误:
C:\...>echo Hello
Hello
这是变量中的内容%PATH%:
C:\Python36\Scripts\;C:\Python36\;C:\Python27\;C:\Python27\Scripts;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C: \Windows\System32\WindowsPowerShell\v1.0\;C:\Program Files (x86)\ATI Technologies\ATI.ACE\Core-Static;C:\Program Files (x86)\Code Collaborator Client;C:\Program Files (x86)\CollabNet Subversion;C:\Program Files\Git\cmd;C:\Program Files\Git\mingw64\bin;C:\Program Files\Git\usr\bin;C:\ProgramData\chocolatey\bin;
如果我通过 Git bash 运行 cmd,那么就像这样:
C:\Users\nvolynkin\bin;C:\Program Files\Git\mingw64\bin;C:\Program Files\Git\usr\local\bin;C:\Program Files\Git\usr\bin;C:\ Program Files\Git\usr\bin;C:\Program Files\Git\mingw64\bin;C:\Program Files\Git\usr\bin;C:\Users\nvolynkin\bin;C:\Python36\Scripts;C :\Python36;C:\Python27;C:\Python27\Scripts;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0; C:\Program Files (x86)\ATI Technologies\ATI.ACE\Core-Static;C:\Program Files (x86)\Code Collaborator Client;C:\Program Files (x86)\CollabNet Subversion;C:\Program Files \Git\cmd;C:\Program Files\Git\mingw64\bin;C:\Program Files\Git\usr\bin;C:\ProgramData\chocolatey\bin;C:\Program Files\Git\usr\bin\ vendor_perl;C:\Program Files\Git\usr\bin\core_perl
我检查了两个版本中的所有路径%PATH%。没有目录,我创建了它们,但问题仍然存在。
下一步去哪里挖?
同时,了解通话中使用哪种终端会很有趣ctx.run?它看起来像是 cmd.exe,但与我运行Win+R > cmd或cmd.exe从 Git bash 打开的不同。
该问题是已知的,并且正在修复 Windows拉取请求中的错误外壳。
task目前,您可以在运行时直接修补装饰器。代码取自datakortet/dk-tasklib 存储库。由于invoke 0.21已经发布了,但是问题并没有解决,所以我将条件中的版本提高到了22。如果您只需要在 Windows 上执行任务,那么您可以更简单地解决该问题。
invoke.yml与tasks.py.向其中添加以下代码: