【问题标题】:Python 3.x subprocess - interacting with pipes to call psftpPython 3.x 子进程 - 与管道交互以调用 psftp
【发布时间】:2015-07-25 02:19:39
【问题描述】:

我有一个脚本将文件写入磁盘,然后需要使用 psftp 将其上传到远程服务器。

根据我在这个网站上看到的一些答案,我对自己想要做什么有了一个基本的了解,但是因为:

  1. 我的代码是用 Python 3.x 编写的

  2. 我的代码在命令中混合使用了字符串和变量

我没有成功。

这是我的代码(设置变量后)

connection_string = "" +prog+ "-P "  +port+ "-pw " +passwd+ " " +user+"@"+host

p = subprocess.Popen(connection_string.split(),stdin=subprocess.PIPE, stdout=subprocess.PIPE,shell=True)

sftp_cmd = "put "+upload_file

encoded_cmd = str.encode(sftp_cmd)

p.stdin.write(encoded_cmd)
# I would have rather used p.stdin.write(b'sftp_cmd') to create a buffer from the string but that didn't seem to work either.

代码编译,但文件没有上传

1) 我做错了什么? :-)

2) 我如何查看是否建立了连接以及实际通过了什么命令?

3) 这是调用 psftp 的最佳方式吗,或者我应该每次都即时编写一个批处理文件并使用“-b”标志来调用它?

注意。我不能在我的代码中使用标准 Python 发行版不附带的任何库。所以我必须使用psftp。

参考答案:

Can i control PSFTP from a Python script?

formatting strings for stdin.write() in python 3.x

TIA

【问题讨论】:

  • 不能使用 paramiko 等其他库的任何具体原因?另外,您可能想看看 pscp。
  • 由于公司限制,我无法使用外部库。 scp 似乎在服务器上被阻止(我无法控制它)
  • 现在我将命令写入文件并使用 psftp -b 但仍然想知道如何以更 Python 的方式执行此操作。
  • 不要:klass.method(some_object),而是打电话给some_object.method(),例如sftp_cmd.encode()

标签: python python-3.x pipe subprocess sftp


【解决方案1】:

删除shell=True。如果prog 在其标准输入上接受命令并且您希望将其输出作为字节串,那么您可以使用subprocess.check_output()

#!/usr/bin/env python3
from subprocess import check_output

output = check_output([prog, "-P", port, "-pw", passwd, user + "@" + host],
                      input=("put " + upload_file).encode()) # utf8 filename

如果prog 返回非零退出状态(通常意味着错误),则会引发异常。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-09
    • 2017-07-11
    • 2016-12-15
    • 2013-01-05
    • 1970-01-01
    相关资源
    最近更新 更多