Diego
Diego

Reputation: 33

From Python run WinSCP commands in console

I have to run a few commands of WinSCP from a Python class using subprocess.

The goal is to connect a local Windows machine and a Windows server with no FTP installed and download some files. This is what I tried

python    
proc = subprocess.Popen(['WinSCP.exe', '/console', '/WAIT',  user:password@ip:folder , '/WAIT','get' ,'*.txt'], shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)

With this I get it to open the WinSCP console and connect to the server, but it doesn't execute the get command. Is the problem because the get is executed on the Windows console and not in the WinSCP console?

I also tried replacing winscp.exe /console for winscp.com /command.

Is there any way to do this?

Upvotes: 3

Views: 17991

Answers (2)

Martin Prikryl
Martin Prikryl

Reputation: 202494

If you want do without generating a script file, you can use a code like this:

import subprocess

process = subprocess.Popen(
    ['WinSCP.com', '/ini=nul', '/command',
     'open ftp://user:[email protected]', 'get *.txt', 'exit'],
    stdout=subprocess.PIPE, stderr=subprocess.PIPE)
for line in iter(process.stdout.readline, b''):  # replace b'' with '' for Python 2
    print(line.decode().rstrip())

The code uses:


Though using the array for the arguments won't work, if there are spaces in command arguments (like file names). Then you will have to format the complete command-line yourself. See Python double quotes in subprocess.Popen aren't working when executing WinSCP scripting.

Upvotes: 3

jspcal
jspcal

Reputation: 51914

So when using the /script option you should specify a file containing the batch commands.

To specify all the commands on the command line as you're doing, use the /command option instead of /script.

Upvotes: 1

Related Questions