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 &amp;&amp; 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]的主要内容,如果未能解决你的问题,请参考以下文章

Heroku 上的进程间通信

Node.js 应用程序在本地主机上运行良好,但在 Heroku 上部署时显示错误

导入pyspark ETL模块并使用python子进程作为子进程运行时出错

我啥时候需要在 Heroku 中使用工作进程

Python 子进程创建与使用subprocess

Python线程化多个bash子进程?