我对python编程很陌生,我编写了一个脚本来自动将文件通过SFTP上传到远程机器。该脚本运行得非常好,但是有一个我似乎无法弄清楚的问题。如果我在我试图上传的文件所在的目录中,一切都很顺利。但是,当我输入不在所述目录中的文件名时,它不喜欢这样。每次都要浏览不同的文件夹是一件麻烦事。我知道我可以将这些文件整合到一个文件夹中...但我很想尝试自动化这个文件。
/Downloads
目录是硬编码的,因为这是大多数工具所在的位置,是否有人知道如何调整这行代码来获取匹配的文件名,而不管文件所在的目录是什么?
这就是我写的:
#! /usr/bin/python2
# includes
import thirdpartylib
import sys
if len(sys.argv) != 6:
print "Usage: %s file url port username password" % sys.argv[0]
exit(0)
file = sys.argv[1]
host = sys.argv[2]
port = int(sys.argv[3])
username = sys.argv[4]
password = sys.argv[5]
filelocation = "Downloads/%s" % file
transport = thirdpartylib.Transport((host, port))
transport.connect(username=username, password=password)
sftp = thirdpartylib.SFTPClient.from_transport(transport)
sftp.put(file, filelocation)
sftp.close()
transport.close()
答案 0 :(得分:2)
首先,如果您正在使用文件路径进行任何工作,建议您使用一些内置功能来构建它们,以确保您有适当的文件分隔符等。os.path.join
非常适合这一点。
话虽这么说,我建议让用户在文件路径中传递绝对路径(在这种情况下它可以在机器上的任何地方生活)或相对路径(在这种情况下它相对于当前目录) )。我会不将Downloads/
附加到所有文件路径,因为这显然会破坏任何绝对路径,并且它需要个人调用您的程序来了解它的内部。我认为这是一个等同于magic number的文件路径。
那么归结为将filelocation
更改为文件输入参数本身。
filelocation = sys.argv[1]
# You can even do some validation if you want
is not os.path.isfile(filelocation):
print "File '%s' does not exist!" % filelocation
如果您确实希望Downloads/
文件夹成为默认文件夹(如果文件路径不是绝对路径),您可以检查输入是否为绝对路径(使用os.path.isabs
)如果不是,则指定它在Downloads/
目录中。
if not os.path.isabs(filelocation):
filelocation = os.path.join('Downloads', filelocation)
然后用户可以通过两种方式调用您的脚本:
# Loads file in /absolute/path/to/file
./script.py /absolute/path/to/file ...
# Loads filename.txt from Downloads/filename.txt
./script.py filename.txt ...
此外,您似乎可能将sftp.put
输入参数反转。应该首先使用本地文件名。
答案 1 :(得分:2)
我认为你希望filelocation
作为stfp.put
的第一个参数,因为它应该是本地机器上的文件名。此外,您可能希望在Downloads
前面加斜杠。