Heroku -> Python:使用子进程启动可执行文件得到 [Permission Denied]
Posted
技术标签:
【中文标题】Heroku -> Python:使用子进程启动可执行文件得到 [Permission Denied]【英文标题】:Heroku -> Python: Using subprocess to launch an executable gets [Permission Denied] 【发布时间】:2017-11-23 15:45:40 【问题描述】:问题:
我有一个在 heroku 上运行的 python webapp,它创建了一个与Stockfish 国际象棋引擎通信的子进程。
JustWorks™ 都在我的本地机器上,但是在尝试在 Heroku 上部署项目时,我收到一条错误消息:PermissionError: [Errno 13] Permission denied
下面,我已经包含了我尝试部署它时的 heroku 日志。
我知道其他人有 heroku 应用程序在同一个 dyno 中运行 stockfish 引擎,但是我没有太多运气找到资源来帮助我让它工作。任何帮助表示赞赏。谢谢!
日志:
bash
2017-06-20T22:32:48.419694+00:00 heroku[web.1]: Starting process with command `python server.py`
2017-06-20T22:32:51.933668+00:00 app[web.1]: Traceback (most recent call last):
2017-06-20T22:32:51.933687+00:00 app[web.1]: File "server.py", line 23, in <module>
2017-06-20T22:32:51.933882+00:00 app[web.1]: engine = chess.uci.popen_engine(DIR_PATH + "/stockfish_8_x64")
2017-06-20T22:32:51.933884+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.6/site-packages/chess/uci.py", line 1405, in popen_engine
2017-06-20T22:32:51.934623+00:00 app[web.1]: PopenProcess(engine, command, **kwargs)
2017-06-20T22:32:51.934625+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.6/site-packages/chess/uci.py", line 404, in __init__
2017-06-20T22:32:51.934874+00:00 app[web.1]: self.process = subprocess.Popen(command, **popen_args)
2017-06-20T22:32:51.934877+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.6/subprocess.py", line 707, in __init__
2017-06-20T22:32:51.935286+00:00 app[web.1]: restore_signals, start_new_session)
2017-06-20T22:32:51.935288+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.6/subprocess.py", line 1326, in _execute_child
2017-06-20T22:32:51.935988+00:00 app[web.1]: raise child_exception_type(errno_num, err_msg)
2017-06-20T22:32:51.936008+00:00 app[web.1]: PermissionError: [Errno 13] Permission denied
2017-06-20T22:32:52.051035+00:00 heroku[web.1]: State changed from starting to crashed
2017-06-20T22:32:52.035235+00:00 heroku[web.1]: Process exited with status 1
【问题讨论】:
我假设您在git
中有stockfish
可执行文件?如果是这样,您需要检查该文件是否具有执行权限。例如,***.com/questions/6476513/…(该命令仍然适用,即使您已经在 *nix 上)
当测功机每次都被拆除并重新启动时,我该如何在 Heroku 上做到这一点?我应该将其作为 Procfile 命令的一部分吗? web: chmod +x stockfish_8_x64 && python server.py
Git 可以并且应该保留文件权限。我会检查 - 1) git 通过git ls-files HEAD
(或分支名称)拥有哪些权限。第一个字段的最后 3 位是文件模式,以八进制表示。然后2) Heroku 文件系统上有哪些权限(通过heroku run 'ls -al'
)。然后 3) 如果 git perms 没有执行,添加它并重新部署。最后,4) 如果这不能解决问题,那么找到一种方法来修补应用启动时的权限(应用内,通过 os.chmod()
,而不是 Procfile)。
感谢@bimsapi,第四个选项,在应用程序中添加 chmod 权限就像一个魅力!
【参考方案1】:
根据 cmets 回答我自己的问题: stockfish 可执行文件在 heroku 服务器上没有可执行权限,需要明确添加。根据原始问题的 cmets 中的指导,我能够修改我的 server.py 以将可执行权限附加到 stockfish 可执行文件。
Source -> SO: Simple chmod +x in python
【讨论】:
以上是关于Heroku -> Python:使用子进程启动可执行文件得到 [Permission Denied]的主要内容,如果未能解决你的问题,请参考以下文章
Node.js 应用程序在本地主机上运行良好,但在 Heroku 上部署时显示错误