Python Script to Generate MySQL Stored Routines

Here is a quick Python script that reads a MySQL scheme (database) and for each table, it generates Insert, Update, Get and Delete stored routines.  The script is just a "quick-n-dirty" script, but it does take into account that the Update, Get and Delete routines need to key off the primary key (and if there's not one, there could be trouble!).  Each stored routine is output into a separate file.
I'm attaching the script so you professional Python people can tell me where I could improve the script with respect to simplicity, readability, cleanliness, etc.
I have NOT yet got the command line parameters added to this script, but plan to soon.
#!/usr/bin/env python
# spgen.py
# Copyright 2008 Matt Runion <[email protected]>
import sys
import MySQLdb
# The INSERT template
insertTemplate = """
DELIMITER $$
DROP PROCEDURE IF EXISTS `%s`$$
CREATE PROCEDURE `%s` (%s)
BEGIN
INSERT INTO %s (
%s
) VALUES (
%s
END$$
DELIMITER ;
# The UPDATE template
updateTemplate = """
DELIMITER $$
DROP PROCEDURE IF EXISTS `%s`$$
CREATE PROCEDURE `%s` (%s)
BEGIN
UPDATE %s SET
%s
WHERE
%s;
END$$
DELIMITER ;
# The GET template
getTemplate = """
DELIMITER $$
DROP PROCEDURE IF EXISTS `%s`$$
CREATE PROCEDURE `%s` (%s)
BEGIN
SELECT
%s
FROM %s
WHERE
%s;
END$$
DELIMITER ;
# The DELETE template
deleteTemplate = """
DELIMITER $$
DROP PROCEDURE IF EXISTS `%s`$$
CREATE PROCEDURE `%s` (%s)
BEGIN
DELETE FROM %s
WHERE
%s;
END$$
DELIMITER ;
def generateSPs(dbhost, dbname, dbuser, dbpasswd):
This method reads all the tables from the database and for each of them
generates the following stored routines:
<TableName>_Insert
<TableName>_Update
<TableName>_Get
<TableName>_Delete
# Open the database connection
print 'Connecting to database [%s] on host [%s]' % (dbname, dbhost)
dbConn = MySQLdb.connect(host=dbhost, user=dbuser, passwd=dbpasswd, db=dbname)
cur = dbConn.cursor()
# Get a list of all tables in the database
print 'Reading tables...'
cur.execute("SHOW TABLES FROM %s" % dbname)
tables = cur.fetchall()
for table in tables:
print 'Generating stored procs for table [%s]...' % table[0]
# Get a list of a columns in the current table
cur.execute("SHOW COLUMNS FROM %s" % table[0])
columns = cur.fetchall()
insertUpdateParms = ''
getDeleteParms = ''
whereClause = ''
insertList = ''
valuesList = ''
updateList = ''
for column in columns:
# Reset some variables
print ' %s -- %s [%s, %s, %s]' % (column[0], column[1], column[2], column[3], column[4])
# Append the columns to the input parms
if (len(insertUpdateParms) > 0):
insertUpdateParms += ',\n'
insertList += ',\n'
valuesList += ',\n'
if (len(updateList) > 0):
updateList += ',\n'
insertUpdateParms += '%sIN ' % column[0]
if ((column[1][0:3].lower() == 'var') or (column[1][0:3].lower() == 'cha')):
insertUpdateParms += '%s' % column[1]
elif (column[1][0:3].lower() == 'enu'):
insertUpdateParms += 'varchar(50)'
else:
insertUpdateParms += (column[1].split('('))[0]
insertList += column[0]
valuesList += '%sIN' % column[0]
# Generate the key parms that are used for the Get and Delete
# stored procs, and generate the values for the WHERE clause
# for the Update, Get and Delete stored procs
if (column[3].lower() == 'pri'):
if (len(getDeleteParms) > 0):
getDeleteParms += ',\n'
getDeleteParms += '%sIN ' % column[0]
if (column[1][0:3].lower() == 'var'):
getDeleteParms += '%s' % column[1]
else:
getDeleteParms += (column[1].split('('))[0]
if (len(whereClause) > 0):
whereClause += ' AND \n'
whereClause += '%s = %sIN' % (column[0], column[0])
else:
updateList += '%s = %sIN' % (column[0], column[0])
#print '---'
#print insertUpdateParms
#print '---'
#print getDeleteParms
#print '---'
#print whereClause
#print 'INSERT:'
#print insertTemplate % (table[0] + '_Insert', table[0] + '_Insert', insertUpdateParms, table[0], insertList, valuesList)
#print 'UPDATE:'
#print updateTemplate % (table[0] + '_Update', table[0] + '_Update', insertUpdateParms, table[0], updateList, whereClause)
#print 'GET:'
#print getTemplate % (table[0] + '_Get', table[0] + '_Get', getDeleteParms, insertList, table[0], whereClause)
#print 'DELETE:'
#print deleteTemplate % (table[0] + '_Delete', table[0] + '_Delete', getDeleteParms, table[0], whereClause)
# Write out the INSERT stored proc
file = open('./test/' + table[0] + '_Insert', 'w')
file.write(insertTemplate % (table[0] + '_Insert', table[0] + '_Insert', insertUpdateParms, table[0], insertList, valuesList))
file.close()
# Write out the UPDATE stored proc
file = open('./test/' + table[0] + '_Update', 'w')
file.write(updateTemplate % (table[0] + '_Update', table[0] + '_Update', insertUpdateParms, table[0], updateList, whereClause))
file.close()
# Write out the GET stored proc
file = open('./test/' + table[0] + '_Get', 'w')
file.write(getTemplate % (table[0] + '_Get', table[0] + '_Get', getDeleteParms, insertList, table[0], whereClause))
file.close()
# Write out the DELETE stored proc
file = open('./test/' + table[0] + '_Delete', 'w')
file.write(deleteTemplate % (table[0] + '_Delete', table[0] + '_Delete', getDeleteParms, table[0], whereClause))
file.close()
return 0
if __name__ == '__main__':
generateSPs('<SERVER>', '<DATABASE>', '<USER>', '<PASSWD>')

I found and fixed a bug with some misplaced parenthesis that forced the path to be made all lower-case.  This was a bad thing if the path had some upper case letters in it!
#!/usr/bin/env python
# spgen.py
# Copyright 2008 Matt Runion <[email protected]>
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
# MA 02110-1301, USA.
import sys
import getopt
import os
import MySQLdb
# The INSERT template
insertTemplate = """
DELIMITER $$
DROP PROCEDURE IF EXISTS `%s`$$
CREATE PROCEDURE `%s` (%s)
BEGIN
INSERT INTO %s (
%s
) VALUES (
%s
END$$
DELIMITER ;
# The UPDATE template
updateTemplate = """
DELIMITER $$
DROP PROCEDURE IF EXISTS `%s`$$
CREATE PROCEDURE `%s` (%s)
BEGIN
UPDATE %s SET
%s
WHERE
%s;
END$$
DELIMITER ;
# The GET template
getTemplate = """
DELIMITER $$
DROP PROCEDURE IF EXISTS `%s`$$
CREATE PROCEDURE `%s` (%s)
BEGIN
SELECT
%s
FROM %s
WHERE
%s;
END$$
DELIMITER ;
# The DELETE template
deleteTemplate = """
DELIMITER $$
DROP PROCEDURE IF EXISTS `%s`$$
CREATE PROCEDURE `%s` (%s)
BEGIN
DELETE FROM %s
WHERE
%s;
END$$
DELIMITER ;
def generateSPs(dbhost, dbname, dbuser, dbpasswd, outPath):
This method reads all the tables from the database and for each of them
generates the following stored routines:
<TableName>_Insert
<TableName>_Update
<TableName>_Get
<TableName>_Delete
# Open the database connection
print 'Connecting to database [%s] on host [%s]' % (dbname, dbhost)
dbConn = MySQLdb.connect(host=dbhost, user=dbuser, passwd=dbpasswd, db=dbname)
cur = dbConn.cursor()
# Get a list of all tables in the database
print 'Reading tables...'
cur.execute("SHOW TABLES FROM %s" % dbname)
tables = cur.fetchall()
for table in tables:
print 'Generating stored procs for table [%s]...' % table[0]
# Get a list of a columns in the current table
cur.execute("SHOW COLUMNS FROM %s" % table[0])
columns = cur.fetchall()
insertUpdateParms = ''
getDeleteParms = ''
whereClause = ''
insertList = ''
valuesList = ''
updateList = ''
for column in columns:
# Reset some variables
print ' %s -- %s [%s, %s, %s]' % (column[0], column[1], column[2], column[3], column[4])
# Append the columns to the input parms
if (len(insertUpdateParms) > 0):
insertUpdateParms += ',\n'
insertList += ',\n'
valuesList += ',\n'
if (len(updateList) > 0):
updateList += ',\n'
insertUpdateParms += '%sIN ' % column[0]
if ((column[1][0:3].lower() == 'var') or (column[1][0:3].lower() == 'cha')):
insertUpdateParms += '%s' % column[1]
elif (column[1][0:3].lower() == 'enu'):
insertUpdateParms += 'varchar(50)'
else:
insertUpdateParms += (column[1].split('('))[0]
insertList += column[0]
valuesList += '%sIN' % column[0]
# Generate the key parms that are used for the Get and Delete
# stored procs, and generate the values for the WHERE clause
# for the Update, Get and Delete stored procs
if (column[3].lower() == 'pri'):
if (len(getDeleteParms) > 0):
getDeleteParms += ',\n'
getDeleteParms += '%sIN ' % column[0]
if (column[1][0:3].lower() == 'var'):
getDeleteParms += '%s' % column[1]
else:
getDeleteParms += (column[1].split('('))[0]
if (len(whereClause) > 0):
whereClause += ' AND \n'
whereClause += '%s = %sIN' % (column[0], column[0])
else:
updateList += '%s = %sIN' % (column[0], column[0])
# Write out the INSERT stored proc
file = open(os.path.join(outPath,(table[0] + '_Insert.sql').lower()), 'w')
file.write(insertTemplate % (table[0] + '_Insert', table[0] + '_Insert', insertUpdateParms, table[0], insertList, valuesList))
file.close()
# Write out the UPDATE stored proc
file = open(os.path.join(outPath,(table[0] + '_Update.sql').lower()), 'w')
file.write(updateTemplate % (table[0] + '_Update', table[0] + '_Update', insertUpdateParms, table[0], updateList, whereClause))
file.close()
# Write out the GET stored proc
file = open(os.path.join(outPath,(table[0] + '_Get.sql').lower()), 'w')
file.write(getTemplate % (table[0] + '_Get', table[0] + '_Get', getDeleteParms, insertList, table[0], whereClause))
file.close()
# Write out the DELETE stored proc
file = open(os.path.join(outPath,(table[0] + '_Delete.sql').lower()), 'w')
file.write(deleteTemplate % (table[0] + '_Delete', table[0] + '_Delete', getDeleteParms, table[0], whereClause))
file.close()
return 0
def main(argv):
SPGen reads all the tables from the given database and for each of
those tables generates the following stored routines:
<TableName>_Insert
<TableName>_Update
<TableName>_Get
<TableName>_Delete
Command line arguments are:
-?, --help: Help
-o, --outputpath: File output path
-h, --host: Database host/server
-d, --database: Database name
-u, --user: Database user
-p, --password Database password
# Set defaults...
outputPath = os.getcwd()
host = 'localhost'
database = ''
user = ''
password = ''
# See what command line options we have
try:
opts, args = getopt.getopt(argv[1:], '?o:h:d:u:p:', ['help', 'outputpath=', 'host=', 'database=', 'user=', 'password='])
except getopt.GetoptError:
print main.__doc__
sys.exit(2)
for opt, arg in opts:
if opt in ['-?', '--help']:
print main.__doc__
sys.exit()
elif opt in ['-o', '--outputpath']:
outputPath = arg
elif opt in ['-h', '--host']:
host = arg
elif opt in ['-d', '--database']:
database = arg
elif opt in ['-u', '--user']:
user = arg
elif opt in ['-p', '--password']:
password = arg
generateSPs(dbhost=host, dbname=database, dbuser=user, dbpasswd=password, outPath=outputPath)
if __name__ == '__main__':
main(sys.argv)
Last edited by mrunion (2008-11-20 19:33:37)

Similar Messages

  • Run Python Script in Automator

    I have a python script (which was written for me), and I would like to make it so that the script executes every x minutes. I know this should be simple to do, but I can't figure it out.
    Thus far, I have created a workflow in automator, used the "Run Shell Script" action, and pasted the script into the text field.
    "Workflow failed - 1 error
    I'm very new to this, so I'm sure it's a simple error. Any help would great.
    Here is the script I am trying to execute.
    #!/Library/Frameworks/Python.framework/Versions/2.7/bin/python
    # you can change the above line to point to the location of python
    # on your system (you can check this by typing 'which python' into
    # Terminal.app), but this isn't necessary if you execute the script
    # using "python ksl.py [URL]"
    # change the value of NAME to your desired name
    NAME = "Bob Jones"
    # change the value of EMAIL to your desired email
    EMAIL = "[email protected]"
    # your message will be the contact name as mined from the page source,
    # followed by whatever message you enter between the following triple quotes
    MESSAGE = """Replace this text with your message. Newlines are also OK."""
    import mechanize
    import re
    import sys
    def setupBrowser(url):
    b = mechanize.Browser()
    # b.sethandlerobots(False)
    # b.addheaders = [('User-agent', 'Mozilla/4.0 (compatible; MSIE 6.0; Windows XP)')]
    try:
    b.open(url)
    except mechanize._mechanize.BrowserStateError:
    print >> sys.stderr, "You have mistyped the URL. It must by in the following format, including the quotes and the preceding 'http://':\n\t %s [--test] 'http://www.blah.com'" % (sys.argv[0])
    sys.exit(1)
    return b
    def grabLinks(b):
    """Takes in a mechanize.Browser() object pointed to a listings URL and returns a listing of classified ad links."""
    links = []
    for link in b.links():
    # change this line if the URL format ever changes
    if re.search(r'&ad=', link.url):
    links.append(mechanize.urljoin(link.base_url, link.url))
    return links
    if _name_ == '_main_':
    # check for proper command line args
    if len(sys.argv) != 2 and len(sys.argv) != 3:
    print >> sys.stderr, "Usage: %s [--test] url" % (sys.argv[0])
    sys.exit(1)
    args = sys.argv[1:]
    if len(args) == 1:
    # start from listings page
    url = args[0]
    # set up the mechanize browser object
    b = setupBrowser(url)
    # grab only the relevant ad links
    links = grabLinks(b)
    if not links or len(links) == 0:
    # the links do not follow the same format as the original page
    print >> sys.stderr, "The link format has changed, or you have mistyped the URL."
    sys.exit(1)
    # open the first link on the listings page
    b.open(links[0])
    else:
    # start from a single listing
    if args[0] != "--test":
    print >> sys.stderr, "Usage %s [--test] url"
    sys.exit(1)
    url = args[1]
    b = setupBrowser(url)
    # grab the HTML so that we can search for the contact name
    response = b.response().get_data()
    # perform a regex search on the HTML for the contact name
    regexSearch = re.search(r'Contact Name:\s*\s(w+)s', response)
    contactName = ""
    if regexSearch:
    # contact name found -- store it
    contactName = regexSearch.group(1)
    else:
    # contact name not found -- use generic greeting
    contactName = "Hello"
    theOne = ""
    # find the "Email Seller" link (stored as "theOne")
    for link in b.links():
    # again, if the URL changes, change this line
    if re.search(r'xmldb=', link.url):
    theOne = mechanize.urljoin(link.base_url, link.url)
    if theOne == "":
    # something went wrong
    print >> sys.stderr, "'Email Seller' link has changed formats within the HTML."
    sys.exit(1)
    b.open(theOne)
    # fill out the forms. note that I am grabbing the SECOND form here.
    # again, this might change over time, so feel free to change this from
    # nr=1 to nr=0 (for the first form), nr=2 (for the third form), etc.
    b.select_form(nr=1)
    b['form_4'] = NAME
    b['form_5'] = EMAIL
    # append the contact name to the rest of the message
    MESSAGE = contactName + """,\n\n""" + MESSAGE
    b['form_6'] = MESSAGE
    # submit the form
    b.submit()
    b.close()

    If the script works, and all you need is to execute every x minutes, use launchd, and its simple to write with the Lingon GUI: http://sourceforge.net/projects/lingon/files/

  • Call an ABAP program or a function module from command prompt/python script

    Dear All,
    I want to call a function module/ABAP program from command prompt or a python script.
    Let me explain with an example.
    There is a function module "z_add" that takes  two integers as input parameters and generates their sum.
    the sum is the output parameter.
    Now i want to call this function module from command prompt / python script and pass parameters to this function module.
    In return i must get the sum(i.e. the output of function module).
    I tried using STARTRFC ,was able to call the FM but could not get the return value(output) from FM.
    Can you please provide me the code of such a function module and the method to call it thereby passing parameters and getting the sum.
    Thanks and regards,
    Gaurav
    Edited by: gauravkec2005 on Mar 4, 2010 7:41 AM

    thank you both!  helpful answers! :o)
    anyway! 
    i have written the program which is called from the SAPScript:
        /:       PERFORM GET_VATNUMBER IN PROGRAM ZFI_F140_OPERATIONS
        /:       USING &BKPF-BUKRS&
        /:       CHANGING &VATNUMBER&
        CE       VAT Registration No : &VATNUMBER&
        REPORT zfi_f140_operations.
        FORM get_vatnumber TABLES in_par  STRUCTURE itcsy
                                  out_par STRUCTURE itcsy.
          DATA: lv_co_code TYPE bukrs,
                lv_vat_no  TYPE stceg.
          READ TABLE in_par WITH KEY name = 'BKPF-BUKRS'.
          MOVE in_par-value TO lv_co_code.
          SELECT SINGLE stceg FROM t001
            INTO lv_vat_no WHERE bukrs = lv_co_code.
          out_par-name = 'VATNUMBER'.
          WRITE lv_vat_no TO out_par-value.
          CONDENSE out_par-value.
          MODIFY out_par INDEX 1.
        ENDFORM.              
    it is not working and i cannot work out why... 
    i have not been ABAPing for very long but have had a go.... 
    any thoughts as to what i have done wrong?
    or point me where i should be looking?  thank you!

  • Problem Obtaining multiple results from MySql Stored Proc via JDBC

    I've spent alot of time on this and I'd be really grateful for anyones help please!
    I have written a java class to execute a MySQL stored procedure that does an UPDATE and then a SELECT. I want to handle the resultset from the SELECT AND get a count of the number of rows updated by the UPDATE. Even though several rows get updated by the stored proc, getUpdateCount() returns zero.
    It's like following the UPDATE with a SELECT causes the updatecount info to be lost. I tried it in reverse: SELECT first and UPDATE last and it works properly. I can get the resultset and the updatecount.
    My Stored Procedure:
    delimiter $$ CREATE PROCEDURE multiRS( IN drugId int, IN drugPrice decimal(8,2) ) BEGIN UPDATE drugs SET DRUG_PRICE = drugPrice WHERE DRUG_ID > drugId; SELECT DRUG_ID, DRUG_NAME, DRUG_PRICE FROM Drugs where DRUG_ID > 7 ORDER BY DRUG_ID ASC; END $$
    In my program (below) callablestatement.execute() returns TRUE even though the first thing I do in my stored proc is an UPDATE not a SELECT. Is this at odds with the JDBC 2 API? Shouldn't it return false since the first "result" returned is NOT a resultset but an updatecount? Does JDBC return any resultsets first by default, even if INSERTS, UPDATES happened in the stored proc before the SELECTs??
    Excerpt of my Java Class:
    // Create CallableStatement CallableStatement cs = con.prepareCall("CALL multiRS(?,?)"); // Register input parameters ........ // Execute the Stored Proc boolean getResultSetNow = cs.execute(); int updateCount = -1; System.out.println("getResultSetNow: " +getResultSetNow); while (true) { if (getResultSetNow) { ResultSet rs = cs.getResultSet(); while (rs.next()) { // fully process result set before calling getMoreResults() again! System.out.println(rs.getInt("DRUG_ID") +", "+rs.getString("DRUG_NAME") +", "+rs.getBigDecimal("DRUG_PRICE")); } rs.close(); } else { updateCount = cs.getUpdateCount(); if (updateCount != -1) { // it's a valid update count System.out.println("Reporting an update count of " +updateCount); } } if ((!getResultSetNow) && (updateCount == -1)) break; // done with loop, finished all the returns getResultSetNow = cs.getMoreResults(); }
    The output of running the program at command line:
    getResultSetNow: true 28, Apple, 127.00 35, Orange, 127.00 36, Bananna, 127.00 37, Berry, 127.00 Reporting an update count of 0
    During my testing I have noticed:
    1. According to the Java documentation execute() returns true if the first result is a ResultSet object; false if the first result is an update count or there is no result. In my java class callablestatement.execute() will return TRUE if in the stored proc the UPDATE is done first and then the SELECT last or vica versa.
    2. My java class (above) is coded to loop through all results returned from the stored proc in succession. Running this class shows that any resultsets are returned first and then update counts last regardless of the order in which they appear in the stored proc. Maybe there is nothing unusual here, it may be that Java is designed to return any Resultsets first by default even if they didn't happen first in the stored procedure?
    3. In my stored procedure, if the UPDATE happens last then callablestatement.getUpdateCount() will return the correct number of updated rows.
    4. If the UPDATE is followed by a SELECT (see above) then callablestatement.getUpdateCount() will return ZERO even though rows were updated.
    5. I tested it with the stored proc doing SELECT - UPDATE - SELECT and again getUpdateCount() returns ZERO.
    6. I tested it with the stored proc doing SELECT - UPDATE - SELECT - UPDATE and this time getUpdateCount() returns the number rows updated by the last UPDATE and not the first.
    My Setup:
    Mac OS X 10.3.9
    Java 1.4.2
    mysql database 5.0.19
    mysql-connector 5.1.10 (connector/J)
    Maybe I have exposed a bug in JDBC?
    Thanks for your help.

    plica10 wrote:
    Jschell thank you for your response.
    I certainly don't mean to be rude but I often get taken that way. I like to state facts as I see them. I'd love to be proved wrong because then I would understand why my code doesn't work!
    Doesn't matter to me if you are rude or not. Rudeness actually makes it more entertaining for me so that is a plus. Nothing I have seen suggests rudeness.
    In response to your post:
    When a MySql stored procedure has multiple sql statements such as SELECT and UPDATE these statements each produce what the Java API documentation refers to as 'results'. A Java class can cycle through these 'results' using callableStatement dot getMoreResults(), getResultSet() and getUpdateCount() to retrieve the resultset object produced by Select queries and updateCount produced by Inserts, Deletes and Updates.
    As I read your question it seems to me that you have already proven that it does not in fact do that?
    You don't have to read this but in case you think I'm mistaken, there is more detail in the following website under the heading 'Using the Method execute':
    http://docsrv.sco.com/JDK_guide/jdbc/getstart/statement.doc.html#1000107
    Sounds reasonable. But does not your example code prove that this is not what happens for the database and driver that you are using?
    Myself I dont trust update counts at all since, in my experience some databases do not return them. And per other reports sometimes they don't return the correct value either.
    So there are two possibilities - your code is wrong or the driver/database does not do it. For me I would also question whether in the future the driver/database would continue to behave the same if you did find some special way to write your SQL so it does do it. And of course you would also need to insure that every proc that needed this would be written in this special way. Hopefully not too many of those.
    So this functionality is built into java but is not in common use amongst programmers. My java class did successfully execute a stored proc which Selected from and then finally Updated a table. My code displayed the contents of the Select query and told me how many rows were affected by the update.
    It isn't "built into java". It isn't built into jdbc either. If it works at all then the driver and by proxy the database are responsible for it. I suspect that you would be hard pressed to find anything in the JDBC spec that requires what that particular link claims. I believe it is difficult to find anything that suggests that update counts in any form are required.
    So you are left with hoping that a particular driver does do it.
    I suppose it is rare that you would want to do things this way. Returning rowcounts in OUT parameters would be easier but I want my code to be modular enough to cover the situation where a statement may return more than one ResultSet object, more than one update count, or a combination of ResultSet objects and update counts. The sql may need to be generated dynamically, its statements may be unknown at compile time. For instance a user might have a form that allows them to build their own queries...
    Any time I see statements like that it usually makes me a bit uncomfortable. If I am creating data layers I either use an existing framework or I generate the code. For the latter there is no generalization of the usage. Every single operation is laid out in its own code.
    And I have in fact created generalized frameworks in the past before. I won't do it again. Benefits of the other idioms during maintenance are too obvious.

  • Using the advanced telemetry Python script (unrecognized signature)

    I am trying to profile an AIR for Mobile project (using AIR 3.5) in Scout. I (apparently) cannot compile the project in Flash Builder because it utilizies CameraRoll. I'm trying to add advanced telemetry using the Python script at https://github.com/adamcath/telemetry-utils
    First, AFAICT that script has typos in it, where tabs and spaces were mixed for indentation. After fixing those (I think), I always get the error:
    "add-opt-in.py", line 158, in <module>
        raise Exception("Bad SWF: Unrecognized signature: %s" % signature)
    Exception: Bad SWF: Unrecognized signature: b'CWS'

    Hi,
       I have converted all space based indentations to tabs in the attached script and it works fine for all the SWFs that I tried.
       Could you please give this a try with your SWFs and let us know if it works ?
       Dowload link - https://docs.google.com/open?id=0B_py8ocVzd4edG51cEN3MkhPbWM
       If it still does not work, can you send us below details and a sample SWF if possible.
           1. OS : Win / Mac version
           2. Version of Python
            3. Compiler / IDE / SDK used to generate the SWF
    Thanks
    Srinivas

  • Python script in dasylab using single input multiple output

    Hello
    For a project, I would like to use the python scripting module of dasylab 13. I got it to work for simple functions such as y=f(x), where i have one input and one output.
    The next step in order to get to where i want to be with my script is using a single input and generating two outputs.
    I defined it in the "predefined settings" that pops up first. The module created looked as it should, having one input and two outputs. However, when I wanted to edit the script (and double clicked the module) the module went back to having one input and one output.
    I searched the help and found the section "channel assignment constants". There describe the various constants, which should have been set in predefined settings. In my case it is CR_1_2.
    It also states to setup the meta data in the SetupFifo tab.
    Now here is my problem: How should i change the SetupFifo tab?
    I tried the command:
    self.SetChannelRelation(channel_no, Ly.CR_1_2)
    Unfotunately this didn't work, which doesn't supprise me, as I made this command up, based on the examples in the help file on the SetupFifo tab. Those are, however, for SetChannelFlags and SetChannelType, which I don't think I need yet...
    Has anyone experienced a similar problem? I also installed a trial version on another computer to check if it works there (it doesn't).
    Or does someone know a method to find out how to be able to change inputs and outputs the way i want?
    Every help will be greatly appreciated.
    Sincerely, Jarno

    You do not need to set the channel relation for "simple" channel relation like 1:2, 2:1, etc.
    Just set the relation you want in the configration dialog that open when you drop a script module into to worksheet.
    The channel relation and their python constants have nothing to do with the amount of inputs and outputs of a script module.
    The channel relation tells the "DASYLab core" how to guide meta data (channel names, units, etc) through a module.
    In function "DlgInit" you have to tell DASYLab how many inputs and outputs your module should have.
    Your module should have 2 outputs for each input: this combination of input and outputs is called a "channel".
    Because one channel has 2 outputs, the module can have max. 8 channels only.
    The dialog with the channelbar "thinks" in  channels, but DASYLab "thinks" in connectors (connectors are inputs/outputs).
    So, you are responsible to translate "channels" in "connectors" and vice versa
    In DlgInit you can ask DASYLab about the amount of inputs and outputs.
    self.NumInChannel <-- amout of connectors on modules left side
    self.NumOutChannel <-- amount of connectors on the right side
    self.DlgNumChannels <-- amount of activated channels in the dialog (something between 1 and DlgMaxChannels)
    Your module's channels have 1 input, 2 outputs each, so you can write either
    self.DlgNumChannels = self.NumOutChannel / 2
    or
    self.DlgNumChannels = self.NumInChannel
    If the module has 3 input and 6 outputs, the dialog will get 3 channels.
    In DlgOk you need to translate the amount of channels into the correct amount of connectors (inputs/outputs):
    For "one channel = 1 input + 2 outputs" this is:
    self.SetConnectors( self.DlgNumChannels, self.DlgNumChannels * 2 )
    DlgInit
    self.DlgNumChannels = self.NumInChannel
    # or: self.DlgNumChannels = self.NumOutChannel / 2
    self.DlgMaxChannels = 8 # or Ly.MAX_CHANNELS/2
    DlgOk
    self.SetConnectors( self.DlgNumChannels, self.DlgNumChannels * 2 )
    M.Sc. Holger Wons | measX GmbH&Co. KG, Mönchengladbach, Germany | DASYLab, DIAdem, LabView --- Support, Projects, Training | Platinum National Instrument Alliance Partner | www.measx.com

  • Script for generating pacman html info

    Hi folks!
    I created a small python script for parsing pacman outputs and generate a html document
    Is under development and not very useful at the moment but I want to share my progress
    Output example: http://tulur.com/pkginfo/example.html
    (is in spanish because my locale conf, the output is in your language)
    http://tulur.com/archlinux-pkginfo
    I'm not a programmer, probably can be improved
    Last edited by bungow (2010-03-08 23:05:01)

    great work, dude.
    Thanks for sharing.

  • MacPro with10.7.3. running a Python script in terminal I see a : "There is no more application memory available on your startup disk". Python uses 10G of 16G RAM and  VM =238G with 1TB free. Log: macx-swapon FAILED - 12. It only happens with larger inputs

    On my MacPro with10.7.3. while running a Python script in terminal, after a while, in several hours actually,  I see a system message for the Terminal app: "There is no more application memory available on your startup disk". Both RAM and VM appear to be fine at this point, i.e. Python uses only 10G of 16G RAM and  VM =238G with ~1TB free. Log reads: " macx-swapon FAILED - 12" multiple times. Furthermore, other terminal windows can be opened and commands run there. It only happens with larger inputs (text files), but with inputs that are about half the size everything runs smoothly.  So the issue must be the memory indeed, but where to look for the problem/fix?

    http://liulab.dfci.harvard.edu/MACS/README.html
    Have you tried with the --diag flag for diagnostics? Or changing verbose to 3 to show debug messages? Clearly one of three things is happening;
    1. You ARE running out of disk space, but once it errors out the space is reclaimed if the output file is deleted on error. When it fails, does your output have the content generated up to the point of termination?
    2. The application (Terminal) is allocated memory that you are exceeding
    3. The task within Terminal is allocated memory that you are exceeding
    I don't know anything about what this does but is there a way to maybe run a smaller test run of it? Something that takes 10 minutes? Just to see if it works.

  • Running python script with system arguments from applescript

    Hi,
    I am trying to run a python code from within applescript. A string should be passed as an argument to the python script, i.e. from the terminal, I would do the following
    cd /Users/thatsme/Library/Scripts/myfolder
    python my_python_file.py abcdefg
    There are two ways I figure I could do this in applescript. "abcdefg" are contained in the variable strNote
    a) directly:
    do shell script "cd /Users/thatsme/Library/Scripts/myfolder; python my_python_file.py " & strNote
    b) calling Terminal
    tell application "Terminal"
      activate
              do script "cd /Users/claushaslauer/Library/Scripts/OO_latex; python my_python_file.py " & strNote
    end tell
    I would prefer option a) as I don't really want to have Terminal windows popping up. The strange thing is, that I see in the applescript results window the result of the print statements in the python script, but no output is generated (the python script contains a few os.system() commands.
    Option b) does what it is supposed to be doing, however, applescript does not wait until the script is finished running.
    Why does option a) nor work, and what do I need to change to make it work?

    Thank you guys for your help, this is really weird.
    Here is my full applescript
    set strNoteQ to "1+1=2"
    (* for whatever reason, this does not work *)
    do shell script "cd /Users/claushaslauer/Library/Scripts/OO_latex; python create_latex_pdf.py " & strNoteQ
    Below is my python skript.
    When I call it as
         python create_latex_pdf.py 1+1=2
    it creates a wonderful pdf.
    With the applescript above, it prints the print statements, it also generates the latex file temp.tex -- correctly, so I assume the string in this example is ok.
    However, it does not execute the latex related commands (the three os.system calls)
    Is it not a good idea / not possible to execute os.system in a python script that is called from applescript? <sorry if I had brought all the attention to the string issue>
    here is the python script:
    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    import sys
    import os
    import datetime
    import time
    def main():
        str_latex_note = sys.argv[1]
        print "%s" %  str_latex_note
        preamble = """\documentclass{article}
    \usepackage{amsmath,amssymb}
    \pagestyle{empty}
    \\begin{document}
    {\huge
    %s
    \end{document}"""% (str_latex_note)
        ## write latex file
        cur_path = r'/Users/mypath/Library/Scripts/OO_latex'
        cur_file = "temp.tex"
        fobj = open(os.path.join(cur_path, cur_file), 'w')
        fobj.writelines(preamble)
        fobj.close()
        ## process latex file
        print cur_path
        os.chdir(cur_path)
        cmd = 'latex temp.tex'
        print cmd
        print "running latex"
        os.system(cmd)
        cmd2 = 'dvips -E -f -X 1200 -Y 1200 temp.dvi > temp.ps'
        print "running dvips"
        os.system(cmd2)
        cmd3 = 'epstopdf temp.ps'
        print "running epstopdf"
        os.system(cmd3)
        print "done!"
    if __name__ == '__main__':
        main()

  • Call a UNIX shell script from an oracle stored procedure

    We need to call a UNIX shell script from an oracle stored procedure
    i.e. the control should come back to the procedure once the script completes. Can any body help to achieve this ?

    There are various ways in achieving this.
    For Example, you can call a PRO*C-Library residing on the database server.
    This requires a PL/SQL library to be generated and some changes to the Listener configuration.
    It is also possible to implement a java procedure on the database being invoked by a PL/SQL wrapper class.
    In this way (and if used right) there is also granularity regarding the filestructure permissions given and it may be called during a Forms or other PL/SQL session.
    The article below explains a more generic approach how to invoke shell commands from within an Oracle Instance.
    Be careful with this, because it really works ;)
    Refer to :
    http://www.oracle-base.com/articles/8i/ShellCommandsFromPLSQL.php
    Message was edited by:
    user434854

  • How can I use automator to open terminal change directory run a python script?

    Hi all,
    I dont really ever use automator - which may be my big problem - and I am trying to make an apllication that seems fairly simple in theroy. I want something that will lunch terminal, cd to the place where my python script lives and then run it. I have tried a number of suggested ways and can get the terminal to open and the directory to change but cant figure out how to run the script. This is my workflow if i did it manually each time
    - open terminal
    - type cd "the place where my file lives"
    - type python uploadr.py -d
    I can get terminal to open then cd to the right place but cant get the "python uploadr.py -d" to run without an error.
    any help would be very appricated
    thanks!!!
    J

    this is the script I got closest with - I know its something to do with breaking those two commands up but i just dont know how to do it
    on run {input, parameters}
              tell application "Terminal"
      activate
                        if (the (count of the window) = 0) or ¬
                                  (the busy of window 1 = true) then
                                  tell application "System Events"
      keystroke "n" using command down
                                  end tell
                        end if
                        do script "cd /Users/behole/Desktop/FlickrUpload/" & "python uploadr.py -d" in window 1
              end tell
              return input
    end run
    this is the error I get in terminal after I run it
    Last login: Mon Jul 23 15:37:17 on ttys000
    be-holes-MacBook-Pro:~ behole$ cd /Users/behole/Desktop/FlickrUpload/python uploadr.py -d
    -bash: cd: /Users/behole/Desktop/FlickrUpload/python: No such file or directory
    be-holes-MacBook-Pro:~ behole$

  • How to call a python script from a TestStand sequence?

    Please tell me how is it possible to call a python script from a TestStand sequence.
    Thank for your help in advance.
    Imre

    Here you can find some information about Python and LabVIEW:
    http://forums.ni.com/ni/board/message?board.id=170​&message.id=124424&query.id=149647#M124424
    If you have LabVIEW, you could use LabVIEW steps to call your Phyton Scipts.
    Another solution would be, to do, what is decriibed in the thread directly in TestStand:
    You can call a dll or .NET assemblies directly from teststand, or use the "Call Executable" TestStep.

  • Unexpected error when running Python scripts?

    I always get this crash when I try to run python scripts. Anyone know what is causing this or how to fix it?
    Process:         Python [8022]
    Path:            /System/Library/Frameworks/Python.framework/Versions/2.7/Resources/Python.app/C ontents/MacOS/Python
    Identifier:      Python
    Version:         2.7.2 (2.7.2)
    Code Type:       X86-64 (Native)
    Parent Process:  ??? [1]
    User ID:         501
    Date/Time:       2012-11-23 05:13:46.990 -0700
    OS Version:      Mac OS X 10.8.2 (12C60)
    Report Version:  10
    Interval Since Last Report:          62859 sec
    Crashes Since Last Report:           6
    Per-App Crashes Since Last Report:   4
    Anonymous UUID:                      9A83E25A-0D91-6DC9-960B-E7126A515A89
    Crashed Thread:  0  Dispatch queue: com.apple.main-thread
    Exception Type:  EXC_BAD_ACCESS (SIGSEGV)
    Exception Codes: KERN_INVALID_ADDRESS at 0x00007faa1b19ad5e
    VM Regions Near 0x7faa1b19ad5e:
        MALLOC_TINY            00007faa1b000000-00007faa1b100000 [ 1024K] rw-/rwx SM=COW 
    -->
        MALLOC_SMALL           00007faa1b800000-00007faa1c800000 [ 16.0M] rw-/rwx SM=COW 
    Application Specific Information:
    *** single-threaded process forked ***
    Thread 0 Crashed:: Dispatch queue: com.apple.main-thread
    0   libsystem_c.dylib                       0x00007fff87fafde1 tiny_free_list_add_ptr + 112
    1   libsystem_c.dylib                       0x00007fff87fb354e tiny_malloc_from_free_list + 1078
    2   libsystem_c.dylib                       0x00007fff87fb3ad8 szone_malloc_should_clear + 971
    3   libsystem_c.dylib                       0x00007fff87fa6153 malloc_zone_malloc + 71
    4   libsystem_c.dylib                       0x00007fff87fa6c61 realloc + 82
    5   org.python.python                       0x00000001065e6ac9 0x10658b000 + 375497
    6   org.python.python                       0x00000001065e4b23 0x10658b000 + 367395
    7   org.python.python                       0x00000001065e6646 0x10658b000 + 374342
    8   org.python.python                       0x00000001065a4494 PyEval_EvalFrameEx + 8967
    9   org.python.python                       0x00000001065a2147 PyEval_EvalCodeEx + 1934
    10  org.python.python                       0x00000001065dbd7a 0x10658b000 + 331130
    11  org.python.python                       0x000000010659a6c6 PyObject_Call + 97
    12  org.python.python                       0x00000001065b79bf 0x10658b000 + 182719
    13  org.python.python                       0x000000010659a6c6 PyObject_Call + 97
    14  org.python.python                       0x00000001065a8018 PyEval_CallObjectWithKeywords + 177
    15  org.python.python                       0x00000001065ba46e PyCodec_Encode + 78
    16  org.python.python                       0x0000000106633978 PyUnicodeUCS2_AsEncodedString + 141
    17  org.python.python                       0x00000001065c232f 0x10658b000 + 226095
    18  org.python.python                       0x00000001065c0c91 0x10658b000 + 220305
    19  org.python.python                       0x00000001065bfc43 0x10658b000 + 216131
    20  org.python.python                       0x00000001065bff0d PyArg_ParseTuple + 143
    21  _socket.so                              0x0000000106b2c7f3 0x106b28000 + 18419
    22  _socket.so                              0x0000000106b2b743 0x106b28000 + 14147
    23  org.python.python                       0x00000001065a2f72 PyEval_EvalFrameEx + 3557
    24  org.python.python                       0x00000001065a2147 PyEval_EvalCodeEx + 1934
    25  org.python.python                       0x00000001065dbd7a 0x10658b000 + 331130
    26  org.python.python                       0x000000010659a6c6 PyObject_Call + 97
    27  _functools.so                           0x00000001068d34a2 0x1068d2000 + 5282
    28  org.python.python                       0x000000010659a6c6 PyObject_Call + 97
    29  org.python.python                       0x00000001065a478d PyEval_EvalFrameEx + 9728
    30  org.python.python                       0x00000001065a2147 PyEval_EvalCodeEx + 1934
    31  org.python.python                       0x00000001065a88df 0x10658b000 + 121055
    32  org.python.python                       0x00000001065a463a PyEval_EvalFrameEx + 9389
    33  org.python.python                       0x00000001065a2147 PyEval_EvalCodeEx + 1934
    34  org.python.python                       0x00000001065a88df 0x10658b000 + 121055
    35  org.python.python                       0x00000001065a463a PyEval_EvalFrameEx + 9389
    36  org.python.python                       0x00000001065a8869 0x10658b000 + 120937
    37  org.python.python                       0x00000001065a463a PyEval_EvalFrameEx + 9389
    38  org.python.python                       0x00000001065a2147 PyEval_EvalCodeEx + 1934
    39  org.python.python                       0x00000001065a19b3 PyEval_EvalCode + 54
    40  org.python.python                       0x00000001065ddc70 0x10658b000 + 339056
    41  org.python.python                       0x00000001065ddd3c PyRun_FileExFlags + 165
    42  org.python.python                       0x00000001065dd726 PyRun_SimpleFileExFlags + 410
    43  org.python.python                       0x0000000106601e27 Py_Main + 2715
    44  libdyld.dylib                           0x00007fff8fe447e1 start + 1
    Thread 1:: Dispatch queue: com.apple.libsystem_network
    0   libsystem_c.dylib                       0x00007fff87fb32dd tiny_malloc_from_free_list + 453
    1   libsystem_c.dylib                       0x00007fff87fb3ad8 szone_malloc_should_clear + 971
    2   libsystem_c.dylib                       0x00007fff87fa6153 malloc_zone_malloc + 71
    3   libsystem_c.dylib                       0x00007fff87fa6ba7 malloc + 41
    4   libsystem_c.dylib                       0x00007fff8801026d tre_make_trans + 412
    5   libsystem_c.dylib                       0x00007fff8800ff59 tre_ast_to_tnfa + 145
    6   libsystem_c.dylib                       0x00007fff8800ff2f tre_ast_to_tnfa + 103
    7   libsystem_c.dylib                       0x00007fff8800e30b tre_compile + 4627
    8   libsystem_c.dylib                       0x00007fff8800c79f regncomp_l + 346
    9   libsystem_c.dylib                       0x00007fff87f9b278 __asl_parse_time_block_invoke_0 + 151
    10  libdispatch.dylib                       0x00007fff8a6ce0b6 _dispatch_client_callout + 8
    11  libdispatch.dylib                       0x00007fff8a6ce041 dispatch_once_f + 50
    12  libsystem_c.dylib                       0x00007fff87f9ad57 asl_parse_time + 61
    13  libsystem_c.dylib                       0x00007fff87fa139a _asl_time_string + 72
    14  libsystem_c.dylib                       0x00007fff87fa130e asl_msg_to_string_raw + 322
    15  libsystem_c.dylib                       0x00007fff87f99c77 _asl_send_message + 1273
    16  libsystem_c.dylib                       0x00007fff87f99412 _asl_lib_vlog + 513
    17  libsystem_c.dylib                       0x00007fff87f86839 vsyslog + 107
    18  libdispatch.dylib                       0x00007fff8a6d3cd1 _dispatch_log + 224
    19  libdispatch.dylib                       0x00007fff8a6cfba0 _dispatch_update_kq + 430
    20  libdispatch.dylib                       0x00007fff8a6cf9ee _dispatch_mgr_wakeup + 16
    21  libdispatch.dylib                       0x00007fff8a6cee65 _dispatch_wakeup + 28
    22  libdispatch.dylib                       0x00007fff8a6cee10 _dispatch_queue_push_list_slow2 + 33
    23  libdispatch.dylib                       0x00007fff8a6ceecd _dispatch_wakeup + 132
    24  libdispatch.dylib                       0x00007fff8a6cf027 _dispatch_resume_slow + 17
    25  libxpc.dylib                            0x00007fff8ea12ff2 _xpc_connection_listen_for_reply + 198
    26  libxpc.dylib                            0x00007fff8ea13ccf xpc_connection_send_message_with_reply + 122
    27  libsystem_network.dylib                 0x00007fff9163bd8c __net_helper_get_settings_block_invoke_0 + 181
    28  libdispatch.dylib                       0x00007fff8a6d1f01 _dispatch_call_block_and_release + 15
    29  libdispatch.dylib                       0x00007fff8a6ce0b6 _dispatch_client_callout + 8
    30  libdispatch.dylib                       0x00007fff8a6cf47f _dispatch_queue_drain + 235
    31  libdispatch.dylib                       0x00007fff8a6cf2f1 _dispatch_queue_invoke + 52
    32  libdispatch.dylib                       0x00007fff8a6cf1c3 _dispatch_worker_thread2 + 249
    33  libsystem_c.dylib                       0x00007fff87f8fcab _pthread_wqthread + 404
    34  libsystem_c.dylib                       0x00007fff87f7a171 start_wqthread + 13
    Thread 2:
    0   libsystem_kernel.dylib                  0x00007fff85af06d6 __workq_kernreturn + 10
    1   libsystem_c.dylib                       0x00007fff87f8feec _pthread_workq_return + 25
    2   libsystem_c.dylib                       0x00007fff87f8fcb3 _pthread_wqthread + 412
    3   libsystem_c.dylib                       0x00007fff87f7a171 start_wqthread + 13
    Thread 0 crashed with X86 Thread State (64-bit):
      rax: 0x00000000000fffe0  rbx: 0x00000000000009ac  rcx: 0x00007faa1b000000  rdx: 0x00007faa1b09ad80
      rdi: 0x0000000106585000  rsi: 0x00000001066fea00  rbp: 0x00007fff5967ced0  rsp: 0x00007fff5967cec8
       r8: 0x000000000000003f   r9: 0x000007faa1b09ad8  r10: 0x00007faa1b0b6300  r11: 0x000000000000fffe
      r12: 0x0000000000000002  r13: 0x00007faa1b09ad60  r14: 0x00000000066efffe  r15: 0x00000001066fea00
      rip: 0x00007fff87fafde1  rfl: 0x0000000000010202  cr2: 0x00007faa1b19ad5e
    Logical CPU: 0
    Binary Images:
           0x106581000 -        0x106581fff  org.python.python (2.7.2 - 2.7.2) <A3CE5618-7FE0-3307-B2C1-DE2661C936B2> /System/Library/Frameworks/Python.framework/Versions/2.7/Resources/Python.app/C ontents/MacOS/Python
           0x10658b000 -        0x106698fff  org.python.python (2.7.2 - 2.7.2) <B2E5B3C9-2D7C-37D7-B23D-84DEF8DDAF28> /System/Library/Frameworks/Python.framework/Versions/2.7/Python
           0x10689b000 -        0x10689efff  operator.so (60.3) <16E539EB-683E-3BDF-83AA-77ED26146560> /System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-dynl oad/operator.so
           0x1068d2000 -        0x1068d3fff  _functools.so (60.3) <610F4A5F-CEE5-3353-94CD-F586D4F2DAD0> /System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-dynl oad/_functools.so
           0x1068d7000 -        0x1068d8fff  _locale.so (60.3) <D7B03EB6-5126-3306-8699-D3816B044AAB> /System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-dynl oad/_locale.so
           0x1068dc000 -        0x1068ddfff  time.so (60.3) <B81E8A2D-38E3-3BA7-AA2F-7A543F20DACF> /System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-dynl oad/time.so
           0x106924000 -        0x106926fff  select.so (60.3) <191F03CF-4038-38AF-A0BA-22AC770298A0> /System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-dynl oad/select.so
           0x10692c000 -        0x10692dfff  fcntl.so (60.3) <5E2DBA68-27EB-3589-B7B4-8B7918DC9716> /System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-dynl oad/fcntl.so
           0x106931000 -        0x106934fff  _struct.so (60.3) <2D1A807F-2084-3CEE-9E4B-DE124502AB69> /System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-dynl oad/_struct.so
           0x10693a000 -        0x10693cfff  binascii.so (60.3) <A96BD9F2-1025-3803-A942-AC8AE48243A9> /System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-dynl oad/binascii.so
           0x106940000 -        0x106941fff  cStringIO.so (60.3) <F4174A1F-B66E-3986-985C-0632FCD266F9> /System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-dynl oad/cStringIO.so
           0x106946000 -        0x106949fff  _collections.so (60.3) <20EAC750-00E1-3216-BB1F-472C0CEA6118> /System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-dynl oad/_collections.so
           0x10698f000 -        0x106995fff  itertools.so (60.3) <C273B16D-A69E-3D3C-B3F5-43F6B0BC333F> /System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-dynl oad/itertools.so
           0x10699e000 -        0x10699efff  _bisect.so (60.3) <BEAA36C6-86EF-3272-9F95-29AED2B60109> /System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-dynl oad/_bisect.so
           0x1069a2000 -        0x1069a3fff  _heapq.so (60.3) <C02D109C-B83B-385E-86E9-04F551749448> /System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-dynl oad/_heapq.so
           0x1069a8000 -        0x1069b3ff7  datetime.so (60.3) <B359E7F5-D6D1-343C-A770-F1186D123691> /System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-dynl oad/datetime.so
           0x1069bc000 -        0x1069c5fff  _sqlite3.so (60.3) <C0006BFF-3590-3B8E-A9B5-DECD4A764236> /System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-dynl oad/_sqlite3.so
           0x106acf000 -        0x106ad3fff  math.so (60.3) <15868E58-734E-3A35-A4C2-AC4625F37902> /System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-dynl oad/math.so
           0x106b19000 -        0x106b1afff  _hashlib.so (60.3) <9B8C96E2-6DE6-3830-B300-35C790DA40C7> /System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-dynl oad/_hashlib.so
           0x106b1f000 -        0x106b22fff  strop.so (60.3) <33FECDE8-3D85-37A8-95CA-08C1F2B820D4> /System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-dynl oad/strop.so
           0x106b28000 -        0x106b2eff7  _socket.so (60.3) <E186283B-C7D4-3D7E-9198-CD7761B70100> /System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-dynl oad/_socket.so
           0x106b36000 -        0x106b39fff  _ssl.so (60.3) <2AEDA15A-56F4-3E82-9415-297BFE6C8F38> /System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-dynl oad/_ssl.so
           0x106b7f000 -        0x106b7ffff  _scproxy.so (60.3) <43CCA6F3-BA7C-3186-8450-B63D00D8AC6F> /System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-dynl oad/_scproxy.so
           0x106bc4000 -        0x106bc8fff  array.so (60.3) <56A0FB1F-7603-3450-AF31-9801D9AB95D5> /System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-dynl oad/array.so
           0x106bce000 -        0x106bcffff  _random.so (60.3) <E2D3E74F-9797-30D4-A9B7-E9FE72564C50> /System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-dynl oad/_random.so
           0x106bd3000 -        0x106bdffff  cPickle.so (60.3) <869D9434-2C00-3EC8-93A1-2A8104957B7E> /System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-dynl oad/cPickle.so
           0x106c25000 -        0x106c29fff  _json.so (60.3) <5899CF83-4D57-34C0-A01F-DC215C5C26D0> /System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-dynl oad/_json.so
           0x106cae000 -        0x106cbffff  _io.so (60.3) <79CDBE7E-1D18-39A6-99AA-CA9466FAD6C2> /System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-dynl oad/_io.so
           0x106d4e000 -        0x106d4efff  grp.so (60.3) <F1C42F13-D323-3F5A-B59E-ACB09DD18ABE> /System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-dynl oad/grp.so
           0x106fd2000 -        0x106fd4fff  zlib.so (60.3) <987E51DB-7827-3F1A-AD5E-CF58C673E644> /System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-dynl oad/zlib.so
           0x106fd9000 -        0x106fdffff  pyexpat.so (60.3) <72D45F21-63F8-3EEF-B71D-DC73B0309D55> /System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-dynl oad/pyexpat.so
           0x107066000 -        0x107077fff  _ctypes.so (60.3) <A4E934BA-B8B3-3CD6-9AA6-78458DEAA491> /System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-dynl oad/_ctypes.so
           0x10740e000 -        0x1074b2ff7  unicodedata.so (60.3) <D2954B53-CE7D-3182-8056-F04F7CAABC6C> /System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-dynl oad/unicodedata.so
        0x7fff66181000 -     0x7fff661b593f  dyld (210.2.3) <A40597AA-5529-3337-8C09-D8A014EB1578> /usr/lib/dyld
        0x7fff84fa3000 -     0x7fff8518cfff  com.apple.CoreFoundation (6.8 - 744.12) <EF002794-DAEF-31C6-866C-E3E3AC387A9F> /System/Library/Frameworks/CoreFoundation.framework/Versions/A/CoreFoundation
        0x7fff851b6000 -     0x7fff853b6fff  libicucore.A.dylib (491.11.1) <CC318A27-878A-38CE-9292-1B98353FA9C7> /usr/lib/libicucore.A.dylib
        0x7fff85724000 -     0x7fff85729fff  libcompiler_rt.dylib (30) <08F8731D-5961-39F1-AD00-4590321D24A9> /usr/lib/system/libcompiler_rt.dylib
        0x7fff85ade000 -     0x7fff85af9ff7  libsystem_kernel.dylib (2050.18.24) <C0535565-35D1-31A7-A744-63D9F10F12A4> /usr/lib/system/libsystem_kernel.dylib
        0x7fff85dc3000 -     0x7fff85dcefff  libsystem_notify.dylib (98.5) <C49275CC-835A-3207-AFBA-8C01374927B6> /usr/lib/system/libsystem_notify.dylib
        0x7fff861ed000 -     0x7fff861eeff7  libSystem.B.dylib (169.3) <365477AB-D641-389D-B8F4-A1FAE9657EEE> /usr/lib/libSystem.B.dylib
        0x7fff86617000 -     0x7fff86625fff  libcommonCrypto.dylib (60026) <2D6537F5-1B5E-305C-A1CF-D1FA80CA3939> /usr/lib/system/libcommonCrypto.dylib
        0x7fff87f30000 -     0x7fff87f38fff  liblaunch.dylib (442.26.2) <2F71CAF8-6524-329E-AC56-C506658B4C0C> /usr/lib/system/liblaunch.dylib
        0x7fff87f79000 -     0x7fff88045fe7  libsystem_c.dylib (825.25) <8CBCF9B9-EBB7-365E-A3FF-2F3850763C6B> /usr/lib/system/libsystem_c.dylib
        0x7fff88046000 -     0x7fff88058ff7  libz.1.dylib (43) <2A1551E8-A272-3DE5-B692-955974FE1416> /usr/lib/libz.1.dylib
        0x7fff88134000 -     0x7fff88159ff7  libc++abi.dylib (24.4) <E7BD9363-1D25-3551-A68A-2E2FF6ABECD7> /usr/lib/libc++abi.dylib
        0x7fff88221000 -     0x7fff88272ff7  com.apple.SystemConfiguration (1.12.2 - 1.12.2) <E095637C-457F-3D8F-AE32-A032F9D5A46C> /System/Library/Frameworks/SystemConfiguration.framework/Versions/A/SystemConfi guration
        0x7fff8835f000 -     0x7fff8838dff7  libsystem_m.dylib (3022.6) <B434BE5C-25AB-3EBD-BAA7-5304B34E3441> /usr/lib/system/libsystem_m.dylib
        0x7fff89823000 -     0x7fff8982bff7  libsystem_dnssd.dylib (379.32.1) <62AA0B84-188A-348B-8F9E-3E2DB08DB93C> /usr/lib/system/libsystem_dnssd.dylib
        0x7fff89f9d000 -     0x7fff8a09afff  libsqlite3.dylib (138.1) <ADE9CB98-D77D-300C-A32A-556B7440769F> /usr/lib/libsqlite3.dylib
        0x7fff8a6cc000 -     0x7fff8a6e1ff7  libdispatch.dylib (228.23) <D26996BF-FC57-39EB-8829-F63585561E09> /usr/lib/system/libdispatch.dylib
        0x7fff8a704000 -     0x7fff8a750ff7  libauto.dylib (185.1) <73CDC482-16E3-3FC7-9BB4-FBA2DA44DBC2> /usr/lib/libauto.dylib
        0x7fff8ac23000 -     0x7fff8ac24fff  libsystem_blocks.dylib (59) <D92DCBC3-541C-37BD-AADE-ACC75A0C59C8> /usr/lib/system/libsystem_blocks.dylib
        0x7fff8acf1000 -     0x7fff8adf3fff  libcrypto.0.9.8.dylib (47) <74F165AD-4572-3B26-B0E2-A97477FE59D0> /usr/lib/libcrypto.0.9.8.dylib
        0x7fff8aeea000 -     0x7fff8b00292f  libobjc.A.dylib (532.2) <90D31928-F48D-3E37-874F-220A51FD9E37> /usr/lib/libobjc.A.dylib
        0x7fff8b070000 -     0x7fff8b072fff  com.apple.TrustEvaluationAgent (2.0 - 23) <A97D348B-32BF-3E52-8DF2-59BFAD21E1A3> /System/Library/PrivateFrameworks/TrustEvaluationAgent.framework/Versions/A/Tru stEvaluationAgent
        0x7fff8b112000 -     0x7fff8b113ff7  libsystem_sandbox.dylib (220) <3C3B03CF-C525-3CB3-8557-62E91B93AC95> /usr/lib/system/libsystem_sandbox.dylib
        0x7fff8ba1a000 -     0x7fff8ba1bff7  libdnsinfo.dylib (453.18) <E7595861-ECF9-336E-9901-BED2620FAA80> /usr/lib/system/libdnsinfo.dylib
        0x7fff8bbfa000 -     0x7fff8bc62ff7  libc++.1.dylib (65.1) <20E31B90-19B9-3C2A-A9EB-474E08F9FE05> /usr/lib/libc++.1.dylib
        0x7fff8c0fb000 -     0x7fff8c132ff7  libssl.0.9.8.dylib (47) <923945E6-C489-3406-903B-A362410753F8> /usr/lib/libssl.0.9.8.dylib
        0x7fff8cd20000 -     0x7fff8cd56fff  libsystem_info.dylib (406.17) <4FFCA242-7F04-365F-87A6-D4EFB89503C1> /usr/lib/system/libsystem_info.dylib
        0x7fff8d244000 -     0x7fff8d249fff  libcache.dylib (57) <65187C6E-3FBF-3EB8-A1AA-389445E2984D> /usr/lib/system/libcache.dylib
        0x7fff8ea07000 -     0x7fff8ea29ff7  libxpc.dylib (140.41) <FAC04D8B-680E-325F-8F0C-DD69859D0E01> /usr/lib/system/libxpc.dylib
        0x7fff8eadd000 -     0x7fff8eb2cff7  libcorecrypto.dylib (106.2) <CE0C29A3-C420-339B-ADAA-52F4683233CC> /usr/lib/system/libcorecrypto.dylib
        0x7fff8eb55000 -     0x7fff8eb57fff  libquarantine.dylib (52) <4BE2E642-A14F-340A-B482-5BD2AEFD9C24> /usr/lib/system/libquarantine.dylib
        0x7fff8f0ec000 -     0x7fff8f0f2fff  libmacho.dylib (829) <BF332AD9-E89F-387E-92A4-6E1AB74BD4D9> /usr/lib/system/libmacho.dylib
        0x7fff8fe42000 -     0x7fff8fe45ff7  libdyld.dylib (210.2.3) <F59367C9-C110-382B-A695-9035A6DD387E> /usr/lib/system/libdyld.dylib
        0x7fff8fe93000 -     0x7fff8fe95ff7  libunc.dylib (25) <92805328-CD36-34FF-9436-571AB0485072> /usr/lib/system/libunc.dylib
        0x7fff8fe96000 -     0x7fff8fe9dfff  libcopyfile.dylib (89) <876573D0-E907-3566-A108-577EAD1B6182> /usr/lib/system/libcopyfile.dylib
        0x7fff9022f000 -     0x7fff90230fff  libffi.dylib (18) <D20FE81C-271C-3446-ABC8-50B6A6F5BEA4> /usr/lib/libffi.dylib
        0x7fff904f0000 -     0x7fff9050bff7  libexpat.1.dylib (12) <95D59F1F-0A5C-3F33-BA97-26F7D796CE7A> /usr/lib/libexpat.1.dylib
        0x7fff908e2000 -     0x7fff908e3fff  libDiagnosticMessagesClient.dylib (8) <8548E0DC-0D2F-30B6-B045-FE8A038E76D8> /usr/lib/libDiagnosticMessagesClient.dylib
        0x7fff90c13000 -     0x7fff90c14ff7  libremovefile.dylib (23.1) <DBBFAF35-AC78-3856-92F6-6E4FD9DF14A2> /usr/lib/system/libremovefile.dylib
        0x7fff912c0000 -     0x7fff912c6ff7  libunwind.dylib (35.1) <21703D36-2DAB-3D8B-8442-EAAB23C060D3> /usr/lib/system/libunwind.dylib
        0x7fff91562000 -     0x7fff915cbfff  libstdc++.6.dylib (56) <EAA2B53E-EADE-39CF-A0EF-FB9D4940672A> /usr/lib/libstdc++.6.dylib
        0x7fff915cc000 -     0x7fff915ccfff  libkeymgr.dylib (25) <CC9E3394-BE16-397F-926B-E579B60EE429> /usr/lib/system/libkeymgr.dylib
        0x7fff91635000 -     0x7fff91643ff7  libsystem_network.dylib (77.10) <0D99F24E-56FE-380F-B81B-4A4C630EE587> /usr/lib/system/libsystem_network.dylib
    External Modification Summary:
      Calls made by other processes targeting this process:
        task_for_pid: 0
        thread_create: 0
        thread_set_state: 0
      Calls made by this process:
        task_for_pid: 0
        thread_create: 0
        thread_set_state: 0
      Calls made by all processes on this machine:
        task_for_pid: 5843
        thread_create: 1
        thread_set_state: 0
    VM Region Summary:
    ReadOnly portion of Libraries: Total=67.5M resident=24.5M(36%) swapped_out_or_unallocated=43.0M(64%)
    Writable regions: Total=66.6M written=11.4M(17%) resident=19.8M(30%) swapped_out=0K(0%) unallocated=46.8M(70%)
    REGION TYPE                      VIRTUAL
    ===========                      =======
    MALLOC                             55.5M
    MALLOC guard page                    32K
    STACK GUARD                        56.0M
    Stack                              10.6M
    VM_ALLOCATE                          20K
    __DATA                             1924K
    __LINKEDIT                         53.6M
    __TEXT                             13.9M
    __UNICODE                           544K
    shared memory                        12K
    ===========                      =======
    TOTAL                             192.0M
    Model: MacBookAir4,2, BootROM MBA41.0077.B0F, 2 processors, Intel Core i7, 1.8 GHz, 4 GB, SMC 1.73f65
    Graphics: Intel HD Graphics 3000, Intel HD Graphics 3000, Built-In, 384 MB
    Memory Module: BANK 0/DIMM0, 2 GB, DDR3, 1333 MHz, 0x80AD, 0x484D54333235533642465238432D48392020
    Memory Module: BANK 1/DIMM0, 2 GB, DDR3, 1333 MHz, 0x80AD, 0x484D54333235533642465238432D48392020
    AirPort: spairport_wireless_card_type_airport_extreme (0x14E4, 0xE9), Broadcom BCM43xx 1.0 (5.106.98.81.22)
    Bluetooth: Version 4.0.9f33 10885, 2 service, 18 devices, 1 incoming serial ports
    Network Service: Wi-Fi, AirPort, en0
    Serial ATA Device: APPLE SSD SM256C, 251 GB
    USB Device: hub_device, 0x0424  (SMSC), 0x2513, 0xfd100000 / 2
    USB Device: Internal Memory Card Reader, apple_vendor_id, 0x8404, 0xfd110000 / 3
    USB Device: FaceTime Camera (Built-in), apple_vendor_id, 0x850a, 0xfa200000 / 3
    USB Device: hub_device, 0x0424  (SMSC), 0x2513, 0xfa100000 / 2
    USB Device: Apple Internal Keyboard / Trackpad, apple_vendor_id, 0x024c, 0xfa120000 / 5
    USB Device: BRCM20702 Hub, 0x0a5c  (Broadcom Corp.), 0x4500, 0xfa110000 / 4
    USB Device: Bluetooth USB Host Controller, apple_vendor_id, 0x821f, 0xfa113000 / 8

    I guess you could say Cheetah is in stable release since 2010 as that was when it was last updated. Python has changed considerably since then.
    Pypl.org shows a list of available packages by ascending Python version. By the time one looks for Cheetah support in Python 2.6, it is strictly Linux. In the Python 2.7 section, there is no Cheetah package listed at all.
    In my estimation, development on Cheetah has been abandoned, and it remains incompatible with Python 2.7.2 as installed on OS X. You should abandon Cheetah. Look at Jinja2, or Django.
    OS X still uses Python scripts for some system activity. If the system version of Python gets messed up with an incompatible module, these system python scripts are compromised too.
    Seriously, look at Pythonbrew. It allows you to create full-blown Python installs and switch between versions and virtual environments.

  • Need help running a Python script when DVD inserted

    We had an intern that created a custom Python script to rip our old event recording DVDs back to a digital format. The script creates a JSON description file and asks a set of questions to create the metadata in the JSON file (e.g. Date of event).
    The way the intern set this up was that you'd click on the Python script which would open a terminal window where you fill in the metadata. It then asks if the DVD is in the computer. At this point you place the DVD in. A few seconds later, the Python script notices the DVD and proceeds to rip the DVD at our specific file size requirements along with the inputted metadata.
    We then upgraded the Mac from Mountain Lion to Lion and the script stopped working. Our intern has since left. I have now moved the Python script onto my Mountain Lion Mac. The intern's last message to me was that he had written an AppleScript that ran when the DVD was inserted which then referred to the Python script. The intern has since stopped replying to emails.
    This is a very important project that I would like to continue. Any help would be greatly appreciated!

    well, oddly, that should never have worked. 
    Try this:  open the applescript editor, copy in the following line:
    tell application "Terminal"
              do script "python /Users/medialab/dvddrip rename"
              activate
    end tell
    Save it, making sure that the 'File Format' pull down says Script (the new file will have a '.scpt' extension). You'll be able to select that file in the cd/dvd preferences.
    I assumed that you wanted this to open in terminal so that you can enter options on the command line. If that's not correct, let me know.

  • Python script to parse 'iwlist scan' into a table

    Hi,
    I've written a small python script that parses the output of the command "iwlist interface scan" into a table.
    Why ?
    Like many arch linux users I think, I use netcfg instead of something like network manager or wicd. So the most natural way to scan for wifi networks in range is iwlist scan. But the output of this command is huge and I find it difficult to retrieve information. So this script parses it into a table : one network, one line.
    Example output
    Name Address Quality Channel Encryption
    wifi_1 01:23:45:67:89:AB 100 % 11 WPA v.1
    wifi_2 01:23:45:67:89:AC 76 % 11 WEP
    wifi_3 01:23:45:67:89:AD 51 % 11 Open
    wifi_4 01:23:45:67:89:AE 50 % 11 WPA v.1
    wifi_5 01:23:45:67:89:AF 43 % 4 Open
    wifi_6 01:23:45:67:89:AG 43 % 4 WPA v.1
    Details
    It reads from stdin so you use it like that: iwlist wlan0 scan | iwlistparse.py
    The width of the columns is determined by what's in it.
    You can easily do a bit more than just parsing the info: in the example above, the quality has been calculated to percents from a ratio (e.g. 46/70).
    It is sorted, too.
    Customization
    It's python so it's easy to customize. See the comments in the code.
    Code
    #!/usr/bin/env python
    # iwlistparse.py
    # Hugo Chargois - 17 jan. 2010 - v.0.1
    # Parses the output of iwlist scan into a table
    import sys
    # You can add or change the functions to parse the properties of each AP (cell)
    # below. They take one argument, the bunch of text describing one cell in iwlist
    # scan and return a property of that cell.
    def get_name(cell):
    return matching_line(cell,"ESSID:")[1:-1]
    def get_quality(cell):
    quality = matching_line(cell,"Quality=").split()[0].split('/')
    return str(int(round(float(quality[0]) / float(quality[1]) * 100))).rjust(3) + " %"
    def get_channel(cell):
    return matching_line(cell,"Channel:")
    def get_encryption(cell):
    enc=""
    if matching_line(cell,"Encryption key:") == "off":
    enc="Open"
    else:
    for line in cell:
    matching = match(line,"IE:")
    if matching!=None:
    wpa=match(matching,"WPA Version ")
    if wpa!=None:
    enc="WPA v."+wpa
    if enc=="":
    enc="WEP"
    return enc
    def get_address(cell):
    return matching_line(cell,"Address: ")
    # Here's a dictionary of rules that will be applied to the description of each
    # cell. The key will be the name of the column in the table. The value is a
    # function defined above.
    rules={"Name":get_name,
    "Quality":get_quality,
    "Channel":get_channel,
    "Encryption":get_encryption,
    "Address":get_address,
    # Here you can choose the way of sorting the table. sortby should be a key of
    # the dictionary rules.
    def sort_cells(cells):
    sortby = "Quality"
    reverse = True
    cells.sort(None, lambda el:el[sortby], reverse)
    # You can choose which columns to display here, and most importantly in what order. Of
    # course, they must exist as keys in the dict rules.
    columns=["Name","Address","Quality","Channel","Encryption"]
    # Below here goes the boring stuff. You shouldn't have to edit anything below
    # this point
    def matching_line(lines, keyword):
    """Returns the first matching line in a list of lines. See match()"""
    for line in lines:
    matching=match(line,keyword)
    if matching!=None:
    return matching
    return None
    def match(line,keyword):
    """If the first part of line (modulo blanks) matches keyword,
    returns the end of that line. Otherwise returns None"""
    line=line.lstrip()
    length=len(keyword)
    if line[:length] == keyword:
    return line[length:]
    else:
    return None
    def parse_cell(cell):
    """Applies the rules to the bunch of text describing a cell and returns the
    corresponding dictionary"""
    parsed_cell={}
    for key in rules:
    rule=rules[key]
    parsed_cell.update({key:rule(cell)})
    return parsed_cell
    def print_table(table):
    widths=map(max,map(lambda l:map(len,l),zip(*table))) #functional magic
    justified_table = []
    for line in table:
    justified_line=[]
    for i,el in enumerate(line):
    justified_line.append(el.ljust(widths[i]+2))
    justified_table.append(justified_line)
    for line in justified_table:
    for el in line:
    print el,
    print
    def print_cells(cells):
    table=[columns]
    for cell in cells:
    cell_properties=[]
    for column in columns:
    cell_properties.append(cell[column])
    table.append(cell_properties)
    print_table(table)
    def main():
    """Pretty prints the output of iwlist scan into a table"""
    cells=[[]]
    parsed_cells=[]
    for line in sys.stdin:
    cell_line = match(line,"Cell ")
    if cell_line != None:
    cells.append([])
    line = cell_line[-27:]
    cells[-1].append(line.rstrip())
    cells=cells[1:]
    for cell in cells:
    parsed_cells.append(parse_cell(cell))
    sort_cells(parsed_cells)
    print_cells(parsed_cells)
    main()
    I hope you find it useful. Please report bugs, I haven't tested it a lot. You may have to customize it though, because I think not all iwlist scan outputs are the same. Again, see comments, it should be easy.

    This tool is very helpfull. I am trying to add a new function to the existing code to parse the signal level parameter from the output of iwlist wlan0 scan, but I am getting lot of issues .Since I am new to python script can anyone help me to extract the signal level also from the scan put put.
    The parametr to be used is Signal level=-44 dBm ,I am trying to create a one more column with Signal level and print its out in the table.
    Example:-
    Signal level
    -44db
    The error I am getting
      File "iwlist_parser_Testing.py", line 146, in <module>
        main()
      File "iwlist_parser_Testing.py", line 144, in main
        print_cells(parsed_cells)
      File "iwlist_parser_Testing.py", line 123, in print_cells
        print_table(table)
      File "iwlist_parser_Testing.py", line 102, in print_table
        widths=map(max,map(lambda l:map(len,l),zip(*table))) #functional magic
      File "iwlist_parser_Testing.py", line 102, in <lambda>
        widths=map(max,map(lambda l:map(len,l),zip(*table))) #functional magic
    TypeError: object of type 'NoneType' has no len()
    Could some pls help me to solve this issue
    Thanks

Maybe you are looking for

  • Printing on paper without spaces ?

    Sir, I have a problem with printing the page of course it is printing the page without any problem but the problem does exists in the setup.I have used the code provided in the forum for printing.Where here when the printing is on, the printer starts

  • Transferring from imac to ibook

    Hi...my first computer was a blue iMac, originally released in 98 with a tray-loading cd....i have lots of pictures and files on there that i would like to transfer to my ibook G4 laptop before I pass the iMac onto a young friend for her first comput

  • Can i get NetAverages with my company's Sitecatalyst license?

    Currently there appears to be no connection between licensing for SiteCatalyst itself and access the SiteCatalyst NetAverages tool via CS Live. According to Adobe's CS Live FAQs: "For-purchase subscriptions are not available at this time; however, Ad

  • Maximum characters in line of notepad line

    Hi, I am reading and writing data on notepad file. Can anybody tell me maximum characters which can be written on single line of notepad file. thanks in advance.

  • ASM resource online and ASM idle instance

    Hi all, SO..........: CentOS 5.8 32bits (VM - VirtualBox) Oracle...: 11gR2 (11.2.0.1.0) On my test environment, i have a VM running Oracle Clusterware and 2 11g instances. The problem is: The ASM service appears online (through ./crsctl status resour