Python 子进程和 Flask 与挂载的交互

问题描述 投票:0回答:1

我正在 Flask 中编写一个辅助应用程序来自动执行服务器上的操作。

我遇到了一个非常令人困惑的问题,我想询问这是否是我使用 Python 子进程的人为因素,或者是否是 Flask 造成的。

当我运行子进程调用以在运行 Flask 应用程序的计算机上安装远程 cifs 共享时,我看到了一些相当奇怪的东西。从 Flask 应用程序的角度来看,共享已挂载,文件可见,并且应用程序可以将文件交互(上传)到远程服务器。

我无法解释的是,这个挂载显然只对运行 Flask 的线程可见。如果我通过 SSH 连接到运行 Flask 的计算机,并在命令行中使用“mount -t cifs”列出目录(或使用 SFTP 连接从我的 PC 文件管理器)请求挂载,则挂载目录为空,并且共享为未报告为已安装。

在提示符处手动运行与 Flask 发出的命令相同的命令会按预期挂载共享。

我尝试使用子进程库中的 Popen 和 run 方法,但结果是相同的,就好像 Flask 应用程序具有独立于操作系统的虚拟文件系统,除了在挂载之前发出的命令是mkdir 在 /mnt/remote 下创建挂载点目录。该命令也会传播到操作系统,并且当我 ls /mnt/remote 目录时会列出新目录。

我还尝试过在有和没有 shell=True 的情况下运行 Popen 调用,这两种方法都在 Flash 线程内工作,否则都没有使挂载可见。

代码片段如下:

`

def run_system_command_shell( cmd ):
    result = subprocess.Popen( cmd, shell=True, text=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
    std_out, std_err = result.communicate()
    rtn_code = result.returncode
    return std_out, std_err, rtn_code

def mount_remote( share_data ):
    cred_file = share_data['cred_file']
    cmd = 'sudo mount '
    cmd = cmd + '-t ' + share_data['share_type'] + ' '
    cmd = cmd + '-o credentials=' + cred_file
    cmd = cmd + ' ' + share_data['share'] + ' ' + share_data['mnt_point']

    std_out, std_err, rtn_code = run_system_command_shell( [cmd] )

    if rtn_code != 0:
        current_app.logger.warning("Could not mount {}. Error: {}".format( share_data['share'], std_out ))
        return False, std_out
    else:
        current_app.logger.info("Mounted {}.".format( share_data['share'] ))

    return True, std_out

`

结果cmd:'sudo mount -t cifs -o凭据=/var/www/ui/config/credentials/10.0.10.10 //10.0.10.10/Install /mnt/remote/10.0.10.10_Install' `

如果这个应用程序要工作,它需要在整个系统上安装远程共享。还有其他人遇到过这个问题吗?有办法解决吗? 谢谢,阿

python multithreading flask subprocess
1个回答
0
投票

你的烧瓶运行得怎么样?根据您的描述,我敢打赌您正在使用 Docker 在容器中运行它。

然后,您所描述的实际上是预期的 - 即使容器指向“真实”文件系统中的挂载点,挂载也仅存在于容器内部。

只需重新配置您的应用程序以在容器外运行。

© www.soinside.com 2019 - 2024. All rights reserved.