Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > Python > newbie question About O'Reilly "Python for Unix and Linux SystemAdministration" ftp Mirror question

Reply
Thread Tools

newbie question About O'Reilly "Python for Unix and Linux SystemAdministration" ftp Mirror question

 
 
moonhkt
Guest
Posts: n/a
 
      09-16-2012
Hi All


O'Reilly Book ISBN 978-986-6840-36-4.

python --version
Python 2.6.2 on AIX 5.3

Using this python to get files in ftp server.

I got below error. What is the error meaning and how to fix ?

ftp_mirror.py
Traceback (most recent call last):
File "/xx../shell/ftpmirror.py", line 80, in <module>
f = FTPSync(options.host, options.username, options.password,
options.remote_dir, options.local_dir, opti
ons.delete)
File "xx../shell/ftpmirror.py", line 17, in __init__
self.conn.cwd(ftp_base_dir)
File "/opt/freeware/lib/python2.6/ftplib.py", line 536, in cwd
cmd = 'CWD ' + dirname
TypeError: cannot concatenate 'str' and 'NoneType' objects

Source :

#!/usr/bin/env python

import ftplib
import os

class FTPSync(object):
def __init__(self, host, username, password, ftp_base_dir,
local_base_dir, delete=False):
self.host = host
self.username = username
self.password = password
self.ftp_base_dir = ftp_base_dir
self.local_base_dir = local_base_dir
self.delete = delete

self.conn = ftplib.FTP(host, username, password)
self.conn.cwd(ftp_base_dir)
try:
os.makedirs(local_base_dir)
except OSError:
pass
os.chdir(local_base_dir)
def get_dirs_files(self):
dir_res = []
self.conn.dir('.', dir_res.append)
files = [f.split(None, [-1] for f in dir_res if
f.startswith('-')]
dirs = [f.split(None, [-1] for f in dir_res if
f.startswith('d')]
return (files, dirs)
def walk(self, next_dir):
print "Walking to", next_dir
self.conn.cwd(next_dir)
try:
os.mkdir(next_dir)
except OSError:
pass
os.chdir(next_dir)

ftp_curr_dir = self.conn.pwd()
local_curr_dir = os.getcwd()

files, dirs = self.get_dirs_files()
print "FILES:", files
print "DIRS:", dirs
for f in files:
print next_dir, ':', f
outf = open(f, 'wb')
try:
self.conn.retrbinary('RETR %s' % f, outf.write)
finally:
outf.close()
if self.delete:
print "Deleting", f
self.conn.delete(f)
for d in dirs:
os.chdir(local_curr_dir)
self.conn.cwd(ftp_curr_dir)
self.walk(d)

def run(self):
self.walk('.')


if __name__ == '__main__':
from optparse import OptionParser
parser = OptionParser()
parser.add_option("-o", "--host", dest="host",
action='store', help="FTP host")
parser.add_option("-u", "--username", dest="username",
action='store', help="FTP username")
parser.add_option("-p", "--password", dest="password",
action='store', help="FTP password")
parser.add_option("-r", "--remote_dir", dest="remote_dir",
action='store', help="FTP remote starting directory")
parser.add_option("-l", "--local_dir", dest="local_dir",
action='store', help="Local starting directory")
parser.add_option("-d", "--delete", dest="delete", default=False,
action='store_true', help="use regex parser")

(options, args) = parser.parse_args()
f = FTPSync(options.host, options.username, options.password,
options.remote_dir, options.local_dir, options.delete)
f.run()

 
Reply With Quote
 
 
 
 
Joel Goldstick
Guest
Posts: n/a
 
      09-16-2012
On Sun, Sep 16, 2012 at 11:09 AM, moonhkt <(E-Mail Removed)> wrote:
> Hi All
>
>
> O'Reilly Book ISBN 978-986-6840-36-4.
>
> python --version
> Python 2.6.2 on AIX 5.3
>
> Using this python to get files in ftp server.
>
> I got below error. What is the error meaning and how to fix ?
>
> ftp_mirror.py
> Traceback (most recent call last):
> File "/xx../shell/ftpmirror.py", line 80, in <module>
> f = FTPSync(options.host, options.username, options.password,
> options.remote_dir, options.local_dir, opti
> ons.delete)
> File "xx../shell/ftpmirror.py", line 17, in __init__
> self.conn.cwd(ftp_base_dir)
> File "/opt/freeware/lib/python2.6/ftplib.py", line 536, in cwd
> cmd = 'CWD ' + dirname
> TypeError: cannot concatenate 'str' and 'NoneType' objects
>
> Source :
>
> #!/usr/bin/env python
>
> import ftplib
> import os
>
> class FTPSync(object):
> def __init__(self, host, username, password, ftp_base_dir,
> local_base_dir, delete=False):
> self.host = host
> self.username = username
> self.password = password
> self.ftp_base_dir = ftp_base_dir
> self.local_base_dir = local_base_dir
> self.delete = delete
>
> self.conn = ftplib.FTP(host, username, password)
> self.conn.cwd(ftp_base_dir)
> try:
> os.makedirs(local_base_dir)
> except OSError:
> pass
> os.chdir(local_base_dir)
> def get_dirs_files(self):
> dir_res = []
> self.conn.dir('.', dir_res.append)
> files = [f.split(None, [-1] for f in dir_res if
> f.startswith('-')]
> dirs = [f.split(None, [-1] for f in dir_res if
> f.startswith('d')]
> return (files, dirs)
> def walk(self, next_dir):
> print "Walking to", next_dir
> self.conn.cwd(next_dir)
> try:
> os.mkdir(next_dir)
> except OSError:
> pass
> os.chdir(next_dir)
>
> ftp_curr_dir = self.conn.pwd()
> local_curr_dir = os.getcwd()
>
> files, dirs = self.get_dirs_files()
> print "FILES:", files
> print "DIRS:", dirs
> for f in files:
> print next_dir, ':', f
> outf = open(f, 'wb')
> try:
> self.conn.retrbinary('RETR %s' % f, outf.write)
> finally:
> outf.close()
> if self.delete:
> print "Deleting", f
> self.conn.delete(f)
> for d in dirs:
> os.chdir(local_curr_dir)
> self.conn.cwd(ftp_curr_dir)
> self.walk(d)
>
> def run(self):
> self.walk('.')
>
>
> if __name__ == '__main__':
> from optparse import OptionParser
> parser = OptionParser()
> parser.add_option("-o", "--host", dest="host",
> action='store', help="FTP host")
> parser.add_option("-u", "--username", dest="username",
> action='store', help="FTP username")
> parser.add_option("-p", "--password", dest="password",
> action='store', help="FTP password")
> parser.add_option("-r", "--remote_dir", dest="remote_dir",
> action='store', help="FTP remote starting directory")
> parser.add_option("-l", "--local_dir", dest="local_dir",
> action='store', help="Local starting directory")
> parser.add_option("-d", "--delete", dest="delete", default=False,
> action='store_true', help="use regex parser")
>
> (options, args) = parser.parse_args()

comment the next line , then print the parameters and see what they
are. That should get you started.
> #f = FTPSync(options.host, options.username, options.password,
> # options.remote_dir, options.local_dir, options.delete)

f = print(options.host, options.username, options.password,
options.remote_dir, options.local_dir, options.delete)


> f.run()
>
> --
> http://mail.python.org/mailman/listinfo/python-list




--
Joel Goldstick
 
Reply With Quote
 
 
 
 
Chris Angelico
Guest
Posts: n/a
 
      09-16-2012
On Mon, Sep 17, 2012 at 1:09 AM, moonhkt <(E-Mail Removed)> wrote:
> Hi All
>
> O'Reilly Book ISBN 978-986-6840-36-4.
>
> python --version
> Python 2.6.2 on AIX 5.3


Hi! Thanks for this, good information to open with.

> Using this python to get files in ftp server.
>
> I got below error. What is the error meaning and how to fix ?
>
> ftp_mirror.py
> Traceback (most recent call last):
> File "/xx../shell/ftpmirror.py", line 80, in <module>
> f = FTPSync(options.host, options.username, options.password,
> options.remote_dir, options.local_dir, opti
> ons.delete)
> File "xx../shell/ftpmirror.py", line 17, in __init__
> self.conn.cwd(ftp_base_dir)
> File "/opt/freeware/lib/python2.6/ftplib.py", line 536, in cwd
> cmd = 'CWD ' + dirname
> TypeError: cannot concatenate 'str' and 'NoneType' objects


NoneType is the type of the singleton object None. Why are you getting
None where you ought to be providing a directory name? Heavily trimmed
code follows:

> def __init__(self, host, username, password, ftp_base_dir,
> local_base_dir, delete=False):
> self.conn.cwd(ftp_base_dir)
> parser.add_option("-r", "--remote_dir", dest="remote_dir",
> action='store', help="FTP remote starting directory")
> f = FTPSync(options.host, options.username, options.password,
> options.remote_dir, options.local_dir, options.delete)


If you don't pass -r/--remote_dir to your script, then (presumably - I
haven't actually used optparse so this is glarked from context)
options.remote_dir is being set to, or left at, None. A quick look at
the docs suggests that one solution is to add a default value to the
options:

http://docs.python.org/library/optpa...default-values

Alternatively, treat the options as mandatory, and provide them on the
command line.

Side point: When you go to the docs page there, you may notice that
optparse is deprecated in favour of argparse. May as well continue the
tutorial with what they recommend, but it's probably worth having a
look at argparse eventually.

Hope that helps!

Chris Angelico
 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
"realtime" fs mirror application (backup, Python and Linux inotify) Roc Zhou Python 0 10-24-2007 08:37 AM
urllib2 ftp mirror Tonino Python 0 08-31-2006 08:03 AM
new comp.lang.python mirror at lampfroums.org--any Linux, Apache, MYSQL, Python Apps? astro Python 5 12-09-2004 11:45 AM
Net::FTP problems getting files from Windows FTP server, but not Linux FTP Server. D. Buck Perl Misc 2 06-29-2004 02:05 PM
Mirror Lock. Newbie to 35mm & slr has a question. Steven C \(Doktersteve\) Digital Photography 3 09-02-2003 02:41 AM



Advertisments