jython Can't list error
Question: I am trying to convert a python class into Java byte code with Jython (on mac
osx lion)

> ./jython -m compileall /Users/owengerig/Downloads/Code\
> Downloads/cryptPYTHON.py

but get this error, which gives no indication of whats wrong

> Listing /Users/owengerig/Downloads/Code Downloads/cryptPYTHON.py ... Can't
> list /Users/owengerig/Downloads/Code Downloads/cryptPYTHON.py

How my python class is setup ([used this post as
example](http://wiki.python.org/jython/ReplaceJythonc)):

    
    
    from Crypto.Cipher import AES
    import base64
    import os
    
    class Crypticle(CryptInterface):
        """Authenticated encryption class
    
         * @param string    $key      base64-encoded encryption key
         * @param integer   $key_len  length of raw key in bits
    
        Encryption algorithm: AES-CBC
        Signing algorithm: HMAC-SHA256
        """
    
        AES_BLOCK_SIZE = 16
    
        @JAVA
        def __init__(self, key_string, key_size=192):
            assert not key_size % 8
            self.key = self.extract_key(key_string, key_size)
            self.key_size = key_size
    
        @classmethod
        def generate_key_string(cls, key_size=192):
            key = os.urandom(key_size / 8)
            return base64.urlsafe_b64encode(str(key))
    
        @classmethod
        def extract_key(cls, key_string, key_size):
            key = base64.urlsafe_b64decode(str(key_string))
            assert len(key) == key_size / 8, "invalid key"
            return key
    
        @JAVA(String, String)    
        def encrypt(self, data):
            """encrypt data with AES-CBC"""
            aes_key = self.key
            pad = self.AES_BLOCK_SIZE - len(data) % self.AES_BLOCK_SIZE
            data = data + pad * chr(pad)
            iv_bytes = os.urandom(self.AES_BLOCK_SIZE)
            cypher = AES.new(aes_key, AES.MODE_CBC, iv_bytes)
            data = iv_bytes + cypher.encrypt(data)
            data_str = base64.urlsafe_b64encode(str(data))
            return data_str
    
        @JAVA(String, String)  
        def decrypt(self, data_str):
            """decrypt data with AES-CBC"""
            aes_key = self.key
            data = base64.urlsafe_b64decode(data_str)
            iv_bytes = data[:self.AES_BLOCK_SIZE]
            data = data[self.AES_BLOCK_SIZE:]
            cypher = AES.new(aes_key, AES.MODE_CBC, iv_bytes)
            data = cypher.decrypt(data)
            return data[:-ord(data[-1])]
    

Also tried this code (per comments below) but go the same error:

    
    
    class Employee(Object):
       def __init__(self):
          self.first = "Josh"
          self.last  = "Juneau"
          self.id = "myempid"
    
       def getEmployeeFirst(self):
          return self.first
    
       def getEmployeeLast(self):
          return self.last
    
       def getEmployeeId(self):
          return self.id
    


Answer: -m compileall takes a directory, not a filename. So you need to execute the following:
    
    
    ./jython -m compileall /Users/owengerig/Downloads/Code\ Downloads/
    

**Long Explanation**

If you open _jythondirectory_ /Lib/compileall.py:

    
    
    try:
        names = os.listdir(dir)
    except os.error:
        print "Can't list", dir
        names = []
    

os.listdir() throws an error if it isn't passed a directory as its argument.
Since this is the function used to compile the command-line arguments, and the
main() function does not check if the arguments are directories, this will
fail.

    
    
            for dir in args:
                if not compile_dir(dir, maxlevels, ddir,
                                   force, rx, quiet):
                    success = 0
    

**/Long Explanation**

