带有 lftp 变量的子进程

subprocess with variable for lftp

我正在尝试从 python 脚本调用子进程。脚本将使用特定参数在 linux 上调用 'lftp',如下所示。问题是我无法传递文件名(文件名每天都会不同)。

我尝试了几乎所有组合但都没有成功(例如:${fname}$fname{fname} 等等)。我 运行 没有想法,所以我正在寻求帮助。

每次我从 ftps 服务器 Access failed: 550 The system cannot find the file specified 收到响应。我可以正常登录和更改文件夹。

import subprocess
import datetime


fname=different_every_day

proc=subprocess.call(
    ["lftp", "-u", "user:password", "ftps://servername:990", "-e",
     "set ftp:ssl-protect-data true; set ftp:ssl-force true; "
     "set ssl:verify-certificate no;get ${fname}"])

print(proc)

P.S。接近正确的答案是 wagnifico,所以我会接受他的回答,但对于其他需要解决方案的人来说,它应该如下所示:

proc=subprocess.call(["lftp","-u","user:pass","ftps://example.something","-e","set ftp:ssl-protect-data true; set ftp:ssl-force true; set ssl:verify-certificate no;cd Ewidencja;pget "+'"'+fname+'"'])

在这里试试:

import os
import time
def python_to_bash(cli_args):
    output = os.popen(cli_args).read()    
    return output

file_name = str(time.time())+".xls"
python_to_bash("lftp -u user:password ftps://servername:990 -e set ftp:ssl-protect-data true set ftp:ssl-force true set ssl:verify-certificate no get "+file_name)

我不知道你需要的命令是否正确,但是当我需要创建任何动态名称时,我会以这种形式使用

您正在混合使用 python 和环境变量。

当您使用 ${fname} 时,bash 认为 fname 是一个环境变量,您的 OS 知道它。由于未定义,它将使用空值,因此找不到文件。

您要么需要在您的终端中定义 fname,然后他们在 python 中调用它,如问题:

export fname='2020-10-29 - All computers.xls'
python your_code.py

另外,调用subprocess.call

时需要加上标志shell=True

或完全在python中定义:

fname='2020-10-29 - All computers.xls'
proc=subprocess.call(
    ["lftp", "-u", "user:password", "ftps://servername:990", "-e",
     "set ftp:ssl-protect-data true; set ftp:ssl-force true; "
     "set ssl:verify-certificate no;get " + fname])