| Line 1: |
Line 1: |
| − | == Install == | + | ====[[Python: Install|Install]]==== |
| − | === Ubuntu server 16.04LTS ===
| |
| − | sudo apt-get update
| |
| − | sudo apt-get install make dpkg-dev libssl-dev libreadline6 libreadline6-dev libsqlite3-dev build-essential libncursesw5-dev libreadline-gplv2-dev
| |
| − | sudo apt-get install libssl-dev libgdbm-dev libc6-dev libsqlite3-dev tk-dev libbz2-dev libncurses-dev
| |
| − | wget https://www.python.org/ftp/python/2.7.12/Python-2.7.12.tar.xz
| |
| − | tar xvf Python-2.7.12.tar.xz
| |
| − | ./configure
| |
| − | make
| |
| − | make install
| |
| | | | |
| − | == Indentation == | + | ==Indentation== |
| | Python is an indented language, so the code indentation matters. A good practice is to indent with 4 spaces (if you mix spaces and tabs the code won't work. | | Python is an indented language, so the code indentation matters. A good practice is to indent with 4 spaces (if you mix spaces and tabs the code won't work. |
| − | == Operators == | + | ==Operators== |
| − | === Arithmetic === | + | ===Arithmetic=== |
| | <nowiki>+ Addition | | <nowiki>+ Addition |
| − | - Substraction | + | - Substraction |
| − | * Multiplication | + | * Multiplication |
| − | / Division | + | / Division |
| − | ** Power | + | ** Power |
| − | % Reminder | + | % Reminder |
| − | // Floor division (Reminder is removed)</nowiki> | + | // Floor division (Reminder is removed)</nowiki> |
| − | === Comparison === | + | ===Comparison=== |
| | <nowiki> | | <nowiki> |
| − | == Equal | + | == Equal |
| − | != Not equal | + | != Not equal |
| − | > Greater | + | > Greater |
| − | >= Greater or equal | + | >= Greater or equal |
| − | < Smaller | + | < Smaller |
| − | <= Smaller or equal | + | <= Smaller or equal |
| − | <> Similar to !=</nowiki> | + | <> Similar to !=</nowiki> |
| − | === Assignment === | + | ===Assignment=== |
| | <nowiki> | | <nowiki> |
| − | = Simple assignment | + | = Simple assignment |
| − | += Add and as | + | += Add and as |
| − | -= Substract and assignment | + | -= Substract and assignment |
| − | *= Multiply and assignment | + | *= Multiply and assignment |
| − | /= Divide and assignment | + | /= Divide and assignment |
| − | %= Modulus and assignment | + | %= Modulus and assignment |
| − | **= Exponent and assignment | + | **= Exponent and assignment |
| − | //= Floor Divisionn and assignment</nowiki> | + | //= Floor Divisionn and assignment</nowiki> |
| | | | |
| − | === Bitwise operators === | + | ===Bitwise operators=== |
| | They perform operations on binary terms. a= 8 → 100; b= 9 → 101; a & b → 100 | | They perform operations on binary terms. a= 8 → 100; b= 9 → 101; a & b → 100 |
| | <nowiki> | | <nowiki> |
| − | $ Binary AND | + | $ Binary AND |
| − | | Binary OR | + | | Binary OR |
| − | ^ Binary XOR | + | ^ Binary XOR |
| − | ~ Binary complement | + | ~ Binary complement |
| − | << Binary left shift | + | << Binary left shift |
| − | >> Binary right shift</nowiki> | + | >> Binary right shift</nowiki> |
| | | | |
| − | === Logic === | + | ===Logic=== |
| | <nowiki> | | <nowiki> |
| − | and | + | and |
| − | or | + | or |
| − | not</nowiki> | + | not</nowiki> |
| | | | |
| − | === Membership operators === | + | ===Membership operators=== |
| | in<br /> | | in<br /> |
| | not in<br /> | | not in<br /> |
| | | | |
| − | == Variables == | + | ==Variables== |
| − | === Numbers === | + | ===Numbers=== |
| − | === String === | + | |
| | + | ====0 padding 2 digits==== |
| | + | <syntaxhighlight lang="python3"> |
| | + | print("{:02d}".format(1)) |
| | + | </syntaxhighlight> |
| | + | |
| | + | ===String=== |
| | String assingment:<br /> | | String assingment:<br /> |
| | MyString = 'Hello World' OR MyString = "Hello World"<br /> | | MyString = 'Hello World' OR MyString = "Hello World"<br /> |
| Line 96: |
Line 93: |
| | len(MyString) → returns the lenght of a string | | len(MyString) → returns the lenght of a string |
| | | | |
| − | === Collections === | + | ===Collections=== |
| − | ==== List ==== | + | ====List==== |
| | Collection - allows us to put many values in a single variable. | | Collection - allows us to put many values in a single variable. |
| | Simple variables are not collections. The previous value is overwritten when changed. | | Simple variables are not collections. The previous value is overwritten when changed. |
| − | * A List is made up of list 'constants'. Lists are surrounded by square brackets [] and the constants in the list are separated by commas. ([2,4,6,8]) | + | |
| − | * A List element can be any Python object, even another list | + | *A List is made up of list 'constants'. Lists are surrounded by square brackets [] and the constants in the list are separated by commas. ([2,4,6,8]) |
| − | * A List can be empty | + | *A List element can be any Python object, even another list |
| − | * Lists are mutable (they can be changed) | + | *A List can be empty |
| − | * When len() is used on a list, it counts the number of constants that make up the list. (not the number of characters) | + | *Lists are mutable (they can be changed) |
| − | * Lists can be concatenated using + | + | *When len() is used on a list, it counts the number of constants that make up the list. (not the number of characters) |
| − | * Lists can be sliced | + | *Lists can be concatenated using + |
| − | * List is a unique type that can be checked using type() (result: <type 'list'>) | + | *Lists can be sliced |
| − | * An empty list can be created with list() | + | *List is a unique type that can be checked using type() (result: <type 'list'>) |
| − | * Lists can be tested for contents using in/not in | + | *An empty list can be created with list() |
| − | * List is an ordered sequence | + | *Lists can be tested for contents using in/not in |
| − | * A list can be sorted with .sort(). Sort changes the list permanently. | + | *List is an ordered sequence |
| − | * sorted(list) → Returns a list sorted. | + | *A list can be sorted with .sort(). Sort changes the list permanently. |
| − | * Methods: append, count, extend, index, insert, pop, remove, reverse, sort | + | *sorted(list) → Returns a list sorted. |
| − | * Functions len() - find length, max() - find highest value, min() - find lowest value, sum() - add all values average can be found with sum()/len() | + | *Methods: append, count, extend, index, insert, pop, remove, reverse, sort |
| | + | *Functions len() - find length, max() - find highest value, min() - find lowest value, sum() - add all values average can be found with sum()/len() |
| | + | *reversed list: |
| | + | **list.reverse() |
| | + | **list[::-1] |
| | + | **reversed(list) |
| | | | |
| | '''Del''' | | '''Del''' |
| Line 120: |
Line 122: |
| | example: a = [1, 2, 3, 4, 5] del a[0] returns [2, 3, 4, 5] | | example: a = [1, 2, 3, 4, 5] del a[0] returns [2, 3, 4, 5] |
| | | | |
| − | ==== Tuple ==== | + | <br /> |
| | + | |
| | + | ====List comprehension==== |
| | + | flatten list<syntaxhighlight lang="python3"> |
| | + | def flatten(list_of_lists): |
| | + | return [element for secondary_list in list_of_lists for element in secondary_list ] |
| | + | |
| | + | a = [[1,2,3], [3,4,5], ["a", "b"]] |
| | + | flatten(a) |
| | + | |
| | + | Out[29]: [1, 2, 3, 3, 4, 5, 'a', 'b'] |
| | + | </syntaxhighlight><br /> |
| | + | |
| | + | ====Tuple==== |
| | Inmutable, declared by () | | Inmutable, declared by () |
| − | * My_tuple = (3, 2, 1) | + | |
| | + | *My_tuple = (3, 2, 1) |
| | + | |
| | You can iterate trough tuples.<br /> | | You can iterate trough tuples.<br /> |
| | You can also refer to the items of a tuple like in a list.<br /> | | You can also refer to the items of a tuple like in a list.<br /> |
| Line 186: |
Line 203: |
| | </source> | | </source> |
| | | | |
| − | ==== Dictionary ==== | + | ====Dictionary==== |
| | Key - Value pairs. They are called diferent in diferent languages:<br /> | | Key - Value pairs. They are called diferent in diferent languages:<br /> |
| | dictionary[key] = value <br /> | | dictionary[key] = value <br /> |
| | | | |
| − | * Perl → Associative arrays | + | *Perl → Associative arrays |
| − | * Java → Properties, Map or HashMap | + | *Java → Properties, Map or HashMap |
| − | * C# → Property bag | + | *C# → Property bag |
| | + | |
| | <br /> | | <br /> |
| | Declarationn and assigment:<br /> | | Declarationn and assigment:<br /> |
| | There are two posible ways to declare them: | | There are two posible ways to declare them: |
| − | * purse = dict() | + | |
| − | * puse = {} | + | *purse = dict() |
| | + | *puse = {} |
| | <source lang="python"> | | <source lang="python"> |
| | purse = dict() | | purse = dict() |
| Line 212: |
Line 231: |
| | purse.get(name, default_value) | | purse.get(name, default_value) |
| | '''Other methods and functions'''<br /> | | '''Other methods and functions'''<br /> |
| − | * list(purse) → Returns a list of keys. | + | |
| − | * dict.keys() → Returns a list of keys. | + | *list(purse) → Returns a list of keys. |
| − | * dict.values() → Returns a list of values. | + | *dict.keys() → Returns a list of keys. |
| − | * dict.items → Returns a list of tuples ( [(key, value), (key, value)...] ) | + | *dict.values() → Returns a list of values. |
| | + | *dict.items → Returns a list of tuples ( [(key, value), (key, value)...] ) |
| | + | |
| | ''' Word count using files and dictionarys'''<br /> | | ''' Word count using files and dictionarys'''<br /> |
| | <source lang="python"> | | <source lang="python"> |
| Line 237: |
Line 258: |
| | </source> | | </source> |
| | | | |
| − | == Conditional == | + | ==Conditional== |
| − | === if/elif/else === | + | ===if/elif/else=== |
| | <source lang="python"> | | <source lang="python"> |
| | if a < 10: | | if a < 10: |
| Line 248: |
Line 269: |
| | </source> | | </source> |
| | | | |
| − | === try/except/finally === | + | ===try/except/finally=== |
| | <source lang="python"> | | <source lang="python"> |
| | try: | | try: |
| Line 258: |
Line 279: |
| | </source> | | </source> |
| | | | |
| − | == Loops == | + | ===Print Exception=== |
| − | === For === | + | <syntaxhighlight lang="python3"> |
| | + | import traceback |
| | + | |
| | + | def bug(): |
| | + | my_dict = {'a': 9} |
| | + | try: |
| | + | return my_dict['b'] |
| | + | except KeyError: |
| | + | print(traceback.format_exc()) |
| | + | return None |
| | + | </syntaxhighlight><br /> |
| | + | ==Loops== |
| | + | ===For=== |
| | <source lang="python"> | | <source lang="python"> |
| | NumberList = [1, 3, 7, 12, 24] | | NumberList = [1, 3, 7, 12, 24] |
| Line 271: |
Line 304: |
| | </source> | | </source> |
| | | | |
| − | === while === | + | ===while=== |
| | <source lang="python"> | | <source lang="python"> |
| | CtrlNum = 7 | | CtrlNum = 7 |
| Line 279: |
Line 312: |
| | </source> | | </source> |
| | | | |
| − | == Functions == | + | ==Functions== |
| | All arguments in Python are passed by reference, if you change a variable value inside a function it will be changed at the calling function. | | All arguments in Python are passed by reference, if you change a variable value inside a function it will be changed at the calling function. |
| | <source lang="python"> | | <source lang="python"> |
| Line 289: |
Line 322: |
| | print arg | | print arg |
| | </source> | | </source> |
| − | == Regular Expressions == | + | ==Regular Expressions== |
| | <nowiki> | | <nowiki> |
| − | ^ → Matches the beginning of a line
| + | ^ → Matches the beginning of a line |
| − | $ → Matches the end of a line
| + | $ → Matches the end of a line |
| − | . → Matches any character
| + | . → Matches any character |
| − | \s → Matches any whitespace
| + | \s → Matches any whitespace |
| − | \S → Matches any non-whitespace
| + | \S → Matches any non-whitespace |
| − | * → Repeats a character 0 or more times
| + | * → Repeats a character 0 or more times |
| − | *? → Repeats a character 0 or more times (non-greedy)
| + | *? → Repeats a character 0 or more times (non-greedy) |
| − | + → Repeats a character 1 or more times
| + | + → Repeats a character 1 or more times |
| − | +? → Repeats a character 1 or more times (non-greedy)
| + | +? → Repeats a character 1 or more times (non-greedy) |
| − | [aeiou] → Matches a single character in the listed set
| + | [aeiou] → Matches a single character in the listed set |
| − | [^XYZ] → Matches a single character NOT in the listed set
| + | [^XYZ] → Matches a single character NOT in the listed set |
| − | [a-z0-9] → The set of characters can include a range | + | [a-z0-9] → The set of characters can include a range |
| − | ( → Indicates where string extraction is to start
| + | ( → Indicates where string extraction is to start |
| − | ) → Indicates where string extraction is to end</nowiki>
| + | ) → Indicates where string extraction is to end</nowiki> |
| | \ → Escape character | | \ → Escape character |
| − | === Regular Expression Module === | + | ===Regular Expression Module=== |
| | It must be imported at the begining of a program: | | It must be imported at the begining of a program: |
| | <source lang="python"> | | <source lang="python"> |
| | import re | | import re |
| | </source> | | </source> |
| − | * re.search(re_string, string) → similar to find() | + | |
| − | * re.findall(re_string, string) → similar to find, returns a list | + | *re.search(re_string, string) → similar to find() |
| − | * re.match(re_string, string) | + | *re.findall(re_string, string) → similar to find, returns a list |
| | + | *re.match(re_string, string) |
| | | | |
| | <source lang="python"> | | <source lang="python"> |
| Line 323: |
Line 357: |
| | print line | | print line |
| | </source> | | </source> |
| − | == Date == | + | ==Date== |
| − | === Today as string === | + | ===Today as string=== |
| | <source lang="python"> | | <source lang="python"> |
| | import datetime | | import datetime |
| | datetime.date.today().strftime("%B %d, %Y") | | datetime.date.today().strftime("%B %d, %Y") |
| | </source> | | </source> |
| − | === String date to date type === | + | ===String date to date type=== |
| | <source lang="python"> | | <source lang="python"> |
| | from datetime import datetime | | from datetime import datetime |
| Line 336: |
Line 370: |
| | </source> | | </source> |
| | | | |
| − | == Files == | + | ==Files== |
| | '''Counting lines in a file''' | | '''Counting lines in a file''' |
| | <source lang="python"> | | <source lang="python"> |
| Line 377: |
Line 411: |
| | print "\n"+("That was "+fname+".").center(40) | | print "\n"+("That was "+fname+".").center(40) |
| | </source> | | </source> |
| − | === CSV === | + | ===CSV=== |
| | <source lang="python"> | | <source lang="python"> |
| | import csv | | import csv |
| Line 423: |
Line 457: |
| | </source> | | </source> |
| | | | |
| − | == Class == | + | ==Run System Commands== |
| | + | |
| | + | ===Python >= 3.5=== |
| | + | <syntaxhighlight lang="python3"> |
| | + | def _run_command(command): |
| | + | log.debug("Command: {}".format(command)) |
| | + | result = subprocess.run(command, shell=True, capture_output=True) |
| | + | |
| | + | if result.stderr: |
| | + | raise subprocess.CalledProcessError( |
| | + | returncode=result.returncode, |
| | + | cmd=result.args, |
| | + | stderr=f"{result.stdout}\n{result.stderr}" |
| | + | ) |
| | + | if result.stdout: |
| | + | log.debug("Command Result: {}".format(result.stdout.decode('utf-8'))) |
| | + | return result |
| | + | </syntaxhighlight> |
| | + | |
| | + | ==Class== |
| | <source lang="python"> | | <source lang="python"> |
| | class MyClass: | | class MyClass: |
| Line 449: |
Line 502: |
| | </source> | | </source> |
| | | | |
| − | * issubclass(sub, sup) | + | *issubclass(sub, sup) |
| − | * isinstance(obj, Class) | + | *isinstance(obj, Class) |
| | | | |
| | '''Generic functionality that can be overriden in own classes'''<br /> | | '''Generic functionality that can be overriden in own classes'''<br /> |
| Line 462: |
Line 515: |
| | '''Hiding attributes''' | | '''Hiding attributes''' |
| | attributes that start with a __ wont be visible to others<br /> | | attributes that start with a __ wont be visible to others<br /> |
| − | == os.system() == | + | |
| | + | ===Subclasing builtins=== |
| | + | |
| | + | ====Perfect dict subclass==== |
| | + | <syntaxhighlight lang="python3"> |
| | + | # has a ton of errors: https://stackoverflow.com/questions/3387691/how-to-perfectly-override-a-dict |
| | + | |
| | + | class LowerDict(dict): |
| | + | __slots__ = () |
| | + | |
| | + | def _process_args(mapping=(), **kwargs): |
| | + | if hasattr(mapping, items): |
| | + | mapping = getattr(mapping, items)() |
| | + | return ((ensure_lower(k), v) for k, v in chain(mapping, getattr(kwargs, items)())) |
| | + | |
| | + | def __init__(self, mapping=(), **kwargs): |
| | + | super(LowerDict, self).__init__(self._process_args(mapping, **kwargs)) |
| | + | |
| | + | def __getitem__(self, k): |
| | + | return super(LowerDict, self).__getitem__(ensure_lower(k)) |
| | + | def __setitem__(self, k, v): |
| | + | return super(LowerDict, self).__setitem__(ensure_lower(k), v) |
| | + | |
| | + | def __delitem__(self, k): |
| | + | return super(LowerDict, self).__delitem__(ensure_lower(k)) |
| | + | |
| | + | def get(self, k, default=None): |
| | + | return super(LowerDict, self).get(ensure_lower(k), default) |
| | + | |
| | + | def setdefault(self, k, default=None): |
| | + | return super(LowerDict, self).setdefault(ensure_lower(k), default) |
| | + | |
| | + | def pop(self, k, v=_RaiseKeyError): |
| | + | if v is _RaiseKeyError: |
| | + | return super(LowerDict, self).pop(ensure_lower(k)) |
| | + | return super(LowerDict, self).pop(ensure_lower(k), v) |
| | + | |
| | + | def update(self, mapping=(), **kwargs): |
| | + | super(LowerDict, self).update(self._process_args(mapping, **kwargs)) |
| | + | def __contains__(self, k): |
| | + | return super(LowerDict, self).__contains__(ensure_lower(k)) |
| | + | |
| | + | def copy(self): # don't delegate w/ super - dict.copy() -> dict :( |
| | + | return type(self)(self) |
| | + | |
| | + | @classmethod |
| | + | def fromkeys(cls, keys, v=None): |
| | + | return super(LowerDict, cls).fromkeys((ensure_lower(k) for k in keys), v) |
| | + | |
| | + | def __repr__(self): |
| | + | return '{0}({1})'.format(type(self).__name__, super(LowerDict, self).__repr__()) |
| | + | </syntaxhighlight> |
| | + | |
| | + | ====Not so perfect dict like object==== |
| | + | <syntaxhighlight lang="python3"> |
| | + | from collections.abc import MutableMapping |
| | + | |
| | + | |
| | + | class TransformedDict(MutableMapping): |
| | + | """A dictionary that applies an arbitrary key-altering |
| | + | function before accessing the keys""" |
| | + | |
| | + | def __init__(self, *args, **kwargs): |
| | + | self.store = dict() |
| | + | self.update(dict(*args, **kwargs)) # use the free update to set keys |
| | + | |
| | + | def __getitem__(self, key): |
| | + | return self.store[self._keytransform(key)] |
| | + | |
| | + | def __setitem__(self, key, value): |
| | + | self.store[self._keytransform(key)] = value |
| | + | |
| | + | def __delitem__(self, key): |
| | + | del self.store[self._keytransform(key)] |
| | + | |
| | + | def __iter__(self): |
| | + | return iter(self.store) |
| | + | |
| | + | def __len__(self): |
| | + | return len(self.store) |
| | + | |
| | + | def _keytransform(self, key): |
| | + | return key |
| | + | </syntaxhighlight> |
| | + | |
| | + | ==os.system()== |
| | To execute a Linux command from Python: | | To execute a Linux command from Python: |
| | <source lang="python"> | | <source lang="python"> |
| | os.system(command) → returns exit status | | os.system(command) → returns exit status |
| | </source> | | </source> |
| − | == Database Access == | + | ==Database Access== |
| − | === MySQLdb === | + | ===MySQLdb=== |
| | '''Table creation''' | | '''Table creation''' |
| | <source lang="python"> | | <source lang="python"> |
| Line 526: |
Line 664: |
| | '''Read example''' | | '''Read example''' |
| | Once the query is made you can: | | Once the query is made you can: |
| | + | |
| | *fetchone() | | *fetchone() |
| | *fetchall() | | *fetchall() |
| Line 564: |
Line 703: |
| | db.close() | | db.close() |
| | </source> | | </source> |
| − | === PostgreSQL === | + | ===PostgreSQL=== |
| | Refer to: [https://wiki.python.org/moin/PostgreSQL PostgreSQL] | | Refer to: [https://wiki.python.org/moin/PostgreSQL PostgreSQL] |
| − | === Other === | + | ===Other=== |
| | Refer to: [https://wiki.python.org/moin/DatabaseInterfaces Database Interfaces] | | Refer to: [https://wiki.python.org/moin/DatabaseInterfaces Database Interfaces] |
| | | | |
| − | == ssh tunneling == | + | ==ssh tunneling== |
| | <source lang="python"> | | <source lang="python"> |
| | import subprocess | | import subprocess |
| Line 578: |
Line 717: |
| | </source> | | </source> |
| | | | |
| − | == Multithreading == | + | ==Multithreading== |
| | <source lang="python"> | | <source lang="python"> |
| | #!/usr/bin/python | | #!/usr/bin/python |
| Line 607: |
Line 746: |
| | import threading | | import threading |
| | </source> | | </source> |
| − | == Python GUI Programming == | + | ==Python GUI Programming== |
| | + | |
| | *Tkinter: Tkinter is the Python interface to the Tk GUI toolkit shipped with Python. We would look this option in this tutorial. | | *Tkinter: Tkinter is the Python interface to the Tk GUI toolkit shipped with Python. We would look this option in this tutorial. |
| | *wxPython: This is an open-source Python interface for wxWindows http://wxpython.org. | | *wxPython: This is an open-source Python interface for wxWindows http://wxpython.org. |
| Line 622: |
Line 762: |
| | </source> | | </source> |
| | '''Widgets''' | | '''Widgets''' |
| | + | |
| | *Button The Button widget is used to display buttons in your application. | | *Button The Button widget is used to display buttons in your application. |
| | *Canvas The Canvas widget is used to draw shapes, such as lines, ovals, polygons and rectangles, in your application. | | *Canvas The Canvas widget is used to draw shapes, such as lines, ovals, polygons and rectangles, in your application. |
| Line 643: |
Line 784: |
| | | | |
| | '''Standard attributes''' | | '''Standard attributes''' |
| | + | |
| | *Dimensions | | *Dimensions |
| | *Colors | | *Colors |
| Line 652: |
Line 794: |
| | | | |
| | '''Geometry Management''' | | '''Geometry Management''' |
| | + | |
| | *The pack() Method - This geometry manager organizes widgets in blocks before placing them in the parent widget. | | *The pack() Method - This geometry manager organizes widgets in blocks before placing them in the parent widget. |
| | *The grid() Method - This geometry manager organizes widgets in a table-like structure in the parent widget. | | *The grid() Method - This geometry manager organizes widgets in a table-like structure in the parent widget. |
| Line 658: |
Line 801: |
| | For further reference visit: tutorialspoint.com/python/python_gui_programming.htm | | For further reference visit: tutorialspoint.com/python/python_gui_programming.htm |
| | | | |
| − | == Enable auto complete in python interpreter == | + | ==Enable auto complete in python interpreter== |
| | Create a file in your home directory named: .pythonrc<br /> | | Create a file in your home directory named: .pythonrc<br /> |
| | Content of this file: | | Content of this file: |
| Line 673: |
Line 816: |
| | To test it import a library, write librariname. and hit tab twice | | To test it import a library, write librariname. and hit tab twice |
| | | | |
| − | == Delete *.pyc == | + | ==Delete *.pyc== |
| | find . -name "*.pyc" -exec rm -rf {} \; | | find . -name "*.pyc" -exec rm -rf {} \; |
| | | | |
| − | == format hex == | + | ==format hex== |
| | | | |
| | | | |
| Line 697: |
Line 840: |
| | '0XFF'<br /> | | '0XFF'<br /> |
| | | | |
| − | == Command completion == | + | ==Command completion== |
| | $ nano ~/.pythonrc | | $ nano ~/.pythonrc |
| | | | |
| Line 716: |
Line 859: |
| | export PYTHONSTARTUP=~/.pythonrc</source> | | export PYTHONSTARTUP=~/.pythonrc</source> |
| | | | |
| − | == nose debug == | + | ==nose debug== |
| | nosetests --debug=nose,nose.importer --debug-log=nose_debug <your usual args> | | nosetests --debug=nose,nose.importer --debug-log=nose_debug <your usual args> |
| | | | |
| − | == Publish Python Package == | + | ==Publish Python Package== |
| − | This would make your package available with: | + | Upload a package to pypi. This would make your package available with: |
| | pip install mypackage | | pip install mypackage |
| | + | ===With setup.py=== |
| | + | nano ~/.pypirc |
| | + | <nowiki>[distutils] |
| | + | index-servers = |
| | + | pypi |
| | + | pypitest |
| | + | |
| | + | [pypi] |
| | + | repository=https://upload.pypi.org/legacy/ |
| | + | username=your_username |
| | + | password=your_password |
| | + | |
| | + | [pypitest] |
| | + | repository=https://testpypi.python.org/pypi |
| | + | username=your_username |
| | + | password=your_password</nowiki> |
| | + | Adjust .pypirc permissions |
| | + | chmod 600 ~/.pypirc |
| | + | In your project, create a setup.py |
| | + | <source lang="python">import os |
| | + | from setuptools import setup, find_packages |
| | | | |
| − | <nowiki>see: https://packaging.python.org/distributing/
| + | # from distutils.core import setup |
| − | # TODO: Check pbr package
| |
| | | | |
| | + | # allow setup.py to be run from any path |
| | + | os.chdir(os.path.normpath(os.path.join(os.path.abspath(__file__), os.pardir))) |
| | | | |
| − | [~/pypirc]
| |
| − | [distutils]
| |
| − | index-servers =
| |
| − | pypi
| |
| − | pypitest
| |
| | | | |
| − | [pypi]
| + | def here(name): |
| − | repository=https://pypi.python.org/pypi
| + | return os.path.join( |
| − | username=your_username
| + | os.path.dirname(os.path.abspath(__file__)), |
| − | password=your_password
| + | name) |
| | | | |
| − | [pypitest]
| |
| − | repository=https://testpypi.python.org/pypi
| |
| − | username=your_username
| |
| − | password=your_password
| |
| | | | |
| | + | def read(name, mode='rb', encoding='utf8'): |
| | + | os.system('pandoc --from=markdown --to=rst --output=README.rst README.md') |
| | + | if os.path.exists('README.rst'): |
| | + | long_description = open('README.rst').read() |
| | + | else: |
| | + | try: |
| | + | with open(here(name), mode) as fp: |
| | + | long_description = fp.read() |
| | + | except IOError: |
| | + | return 'Error generating long description: {} File not found'.format(here(name)) |
| | + | return long_description |
| | | | |
| − | $ chmod 600 ~/.pypirc
| + | # Development Status :: 1 - Planning |
| | + | # Development Status :: 2 - Pre-Alpha |
| | + | # Development Status :: 3 - Alpha |
| | + | # Development Status :: 4 - Beta |
| | + | # Development Status :: 5 - Production/Stable |
| | + | # Development Status :: 6 - Mature |
| | + | # Development Status :: 7 - Inactive |
| | | | |
| | | | |
| − | [setup.py]
| + | license_classifiers = { |
| | + | 'MIT license': 'License :: OSI Approved :: MIT License', |
| | + | 'BSD license': 'License :: OSI Approved :: BSD License', |
| | + | 'ISC license': 'License :: OSI Approved :: ISC License (ISCL)', |
| | + | 'Apache Software License 2.0': 'License :: OSI Approved :: Apache Software License', |
| | + | 'GNU General Public License v3': 'License :: OSI Approved :: GNU General Public License v3 (GPLv3)' |
| | + | } |
| | | | |
| − | from distutils.core import setup
| |
| | setup( | | setup( |
| − | name = 'mypackage',
| + | name='CheKnife', |
| − | packages = ['mypackage'], # this must be the same as the name above
| + | version='v0.0.6b2', |
| − | version = '0.1',
| + | packages=find_packages(), |
| − | description = 'A random test lib',
| + | url='https://git.herrerosolis.com/Misc/CheKnife', |
| − | author = 'Peter Downs',
| + | download_url='https://git.herrerosolis.com/Misc/CheKnife/-/archive/v0.0.6b2/CheKnife-v0.0.6b2.tar.gz', |
| − | author_email = 'peterldowns@gmail.com',
| + | license='MIT license', |
| − | url = 'https://github.com/peterldowns/mypackage', # use the URL to the github repo
| + | author='Rafael Herrero Solis', |
| − | download_url = 'https://github.com/peterldowns/mypackage/tarball/0.1', # I'll explain this in a second
| + | author_email='rafahsolis@hotmail.com', |
| − | keywords = ['testing', 'logging', 'example'], # arbitrary keywords
| + | keywords=['CheKnife', 'Swiss', 'Army', 'Knife', 'Swiss Army Knife'], |
| − | classifiers = [],
| + | description='Python Utilities', |
| − | ) | + | long_description=read('README.md'), |
| − | | + | test_suite='nose.collector', |
| − | [setup.cfg] | + | tests_require=['nose', 'six'], |
| − | [metadata] | + | install_requires=[ |
| − | description-file = README.md
| + | 'six>=1.10.0', |
| − | | + | 'future>=0.16.0', |
| − | [LICENSE.txt]
| + | 'pycryptodome>=3.6.1', |
| − | The MIT License
| + | 'configparser>=3.5.0' |
| − | | + | ], |
| − | SPDX short identifier: MIT
| + | classifiers=[ |
| | + | 'License :: OSI Approved :: MIT License', |
| | + | 'Development Status :: 3 - Alpha', |
| | + | 'License :: OSI Approved :: Apache Software License', |
| | + | 'Programming Language :: Python :: 3.6', |
| | + | ], |
| | + | )</source> |
| | | | |
| − | Copyright <YEAR> <COPYRIGHT HOLDER>
| + | nano setup.cfg |
| | + | <nowiki>[metadata] |
| | + | description-file = README.md</nowiki> |
| | | | |
| − | Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: | + | nano LICENSE |
| | + | <nowiki>The MIT License |
| | + | |
| | + | SPDX short identifier: MIT |
| | + | |
| | + | Copyright <YEAR> <COPYRIGHT HOLDER> |
| | + | |
| | + | Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: |
| | + | |
| | + | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. |
| | + | |
| | + | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.</nowiki> |
| | + | Test and upload |
| | + | <source lang="bash">python setup.py register -r pypitest |
| | + | python setup.py sdist upload -r pypitest |
| | + | python setup.py register -r pypi |
| | + | python setup.py sdist upload -r pypi</source> |
| | | | |
| − | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
| + | ===With twine=== |
| | + | https://packaging.python.org/tutorials/packaging-projects/ |
| | | | |
| − | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
| + | ==Change PyPi== |
| − | | + | ===Using PyPi Local Repository=== |
| − | | |
| − | | |
| − | $ python setup.py register -r pypitest
| |
| − | $ python setup.py sdist upload -r pypitest
| |
| − | $ python setup.py register -r pypi
| |
| − | $ python setup.py sdist upload -r pypi
| |
| − | </nowiki>
| |
| − | == Change PyPi == | |
| − | === Using PyPi Local Repository === | |
| | nano ~/.pip/pip.conf | | nano ~/.pip/pip.conf |
| | <nowiki>[global] | | <nowiki>[global] |
| − | index-url= http://10.255.0.21/pypi/simple | + | index-url= http://10.255.0.21/pypi/simple |
| − | trusted-host= 10.255.0.21</nowiki> | + | trusted-host= 10.255.0.21</nowiki> |
| | | | |
| − | == Using pip behind proxy == | + | ==Using pip behind proxy== |
| | sudo pip --proxy http://proxy.hell:3128 install requests | | sudo pip --proxy http://proxy.hell:3128 install requests |
| | | | |
| − | == Publish to PyPi == | + | ==Publish to PyPi== |
| | Create the file ~/.pypirc | | Create the file ~/.pypirc |
| | <nowiki>[distutils] | | <nowiki>[distutils] |
| − | index-servers = | + | index-servers = |
| − | pypi
| + | pypi |
| − | pypitest
| + | pypitest |
| − | | + | |
| − | [pypi] | + | [pypi] |
| − | repository=https://pypi.python.org/pypi
| + | repository=https://pypi.python.org/pypi |
| − | username=
| + | username= |
| − | password=
| + | password= |
| − | | + | |
| − | [pypitest] | + | [pypitest] |
| − | repository=https://test.pypi.org/legacy
| + | repository=https://test.pypi.org/legacy |
| − | username=
| + | username= |
| − | password=
| + | password= |
| − | </nowiki> | + | </nowiki> |
| | | | |
| | Test | | Test |
| Line 823: |
Line 1,017: |
| | python setup.py sdist upload -r pypi | | python setup.py sdist upload -r pypi |
| | | | |
| − | == AWS boto3 EC2 == | + | == requirements.txt == |
| − | <source lang="python">
| + | |
| | + | === Platform conditional === |
| | + | <syntaxhighlight lang="text"> |
| | + | psycopg2-binary~=2.9.7; platform_system == "Linux" |
| | + | psycopg2~=2.9.6; platform_system == "Windows" |
| | + | </syntaxhighlight> |
| | + | |
| | + | ==AWS boto3 EC2== |
| | + | <source lang="python"> |
| | import boto3 | | import boto3 |
| | client = boto3.client('ec2', aws_access_key_id="AKI.............Q", aws_secret_access_key="2..........................s", region_name='us-east-1') | | client = boto3.client('ec2', aws_access_key_id="AKI.............Q", aws_secret_access_key="2..........................s", region_name='us-east-1') |
| Line 836: |
Line 1,038: |
| | i.public_ip_address | | i.public_ip_address |
| | </source> | | </source> |
| | + | [[Category:Python]] |