在任务之间暂停Python脚本,等待用户继续。

1 投票
2 回答
582 浏览
提问于 2025-04-18 12:22

我想写一个脚本,用来在远程服务器上把一些文件分组,这样我就可以用一个简单的“scp”命令下载我需要的文件。我在想有没有办法让我的脚本在我用scp传文件的时候暂停一下。目前我写的代码是可以工作的,但如果能把这些步骤合并成一个脚本和一个命令就更方便了。

**远程服务器上的脚本:

    for root, dirs, files in os.walk('.'):
        for f in files:
              if ('csv') in file.split('.'):
                     cp_str = ''.join(['cp ', file, ' ~/move_files/.'])
                     subprocess.check_output(cp_str, shell=True)

**然后在我本地电脑的终端上,我用scp把远程服务器上“move_files”文件夹里的所有文件传下来。

**接着我通过ssh回到远程服务器,把那个目录里的文件清空。

为了更清楚,我想在脚本里加一个功能,让它在复制完文件后暂停一下,给我一个信号,告诉我文件已经复制好了。这样我就可以用scp传文件,然后再继续我的脚本,让它回去删除之前复制的文件。

2 个回答

1

下面的方法是基于你远程服务器上的一个稍微修改过的脚本和你自己电脑上的一个脚本,但你只需要调用本地的脚本就可以了。

这是你远程服务器上的脚本:

#!/usr/bin/python
import sys
import os

path = sys.argv[1]

filelist = ""
for root, dirs, files in os.walk(path):
    for f in files:
        if ('csv') in f.split('.'):
            filelist = filelist + ", " + os.path.join(root, f)

print(filelist)

而这是你实际会使用的脚本。这个例子使用了 paramiko 来建立一个 SSH 连接,并且直接复制你远程脚本找到的文件,使用的是 paramiko sftp 模块。

需要的输入信息有:

  • 远程服务器地址 [server]
  • 远程用户名 [user]
  • 远程搜索 .csv 文件的顶级文件夹 [remote_root]

脚本内容:

#!/usr/bin/python
import paramiko
import subprocess
import os
import getpass

server = "your_server"
user = "username"

remote_root = raw_input("Path to remote folder to search: ")

pw = getpass.getpass()

cwd = os.getcwd()
ssh = paramiko.SSHClient()

ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())

print("Connecting to {}".format(server))

ssh.connect(server, username = user, password = pw)
print("Executing remote script")

stdin, stdout, stderr = ssh.exec_command("path_to_your_remote_script")

print("Copy remote content to current working directory ({})".format(cwd))
files = stdout.readlines()
file_path = [str(x.strip()) for x in files[0].split(",")[1:]]

sftp = ssh.open_sftp()
for f in file_path:
    path, filename = os.path.split(f)
    sftp.get(f, os.path.join(cwd, filename))

sftp.close()
ssh.close()
2

一种简单的方法是等待用户输入:

try:
  resume = input("Press Enter to continue.")
except SyntaxError:
  pass

这里用到的try/except是因为如果你在使用input函数时直接按回车,它会返回一个语法错误,因为它期待你输入一些内容,但你什么都没输入。不过我们其实不需要输入,只需要一个信号来表示你准备好继续了。

如果你使用的是旧版本的Python,可以用raw_input来代替input

撰写回答