Publish your own Python Package

Publish your own Python Package

Make your solution available to a broader developer community.

Hello folks, You might have seen some of my packages in the previous blog While working on some project / solving any programming problem, have you developed a new algorithm or utility that can help developers in a more efficient way? So this blog is for you! This blog will discuss How can you publish your own python package? So Let's get started.

There are few terms you should be familiar with -

  • class : Blueprint of object. Object is simply a collection of variables and functions.
  • self : Python keyword, a parameter refers to the current instance of the class.
  • __init__() : A function that runs by default whenever a class is executed.
  • import : Keyword to include package in our program

The links mentioned along with the keywords will help you know more, I have added a summary for your reference above.

In this blog, we will create a simple package that can add numbers from any data structure. I'll be discussing the following ways of doing it.

  • Direct Function Implementation
  • Class Usage
  • Through Function of Class
  • Through the external class of package

We are going to publish our package on pypi.org - A popular collection of all the libraries. First, create an account here and save the login credentials.

Now let's set up a project. Make sure your project name matches the name of the package you intend to publish. I'll be using the different package name for each way I mentioned above.

Direct Function Implementation

Project Name: addition_by_direct_function_implementation Inside this project, create one more subfolder with the same name and one python file main.py. Inside the subfolder create one python file __init__.py

Explanation: We will test our code in main.py, __init__.py is the python script that will run by default when we call our package from the project folder.

Your file structure should look something like this.

image.png

__init__.py Here we have simply defined a function addnumbers with the numbers as parameter. The function returns the sum. Here's the code

def addnumbers(numbersdatastructure):
    add=0
    for i in numbersdatastructure:
        add+=i
    return add

Now our function-based package is ready, let's test on our local system. main.py

from addition_by_direct_function_implementation import addnumbers

sum = addnumbers([1,2,3,4,5,6,7,8,9])

print(sum)

Since we have a subfolder with the name addition_by_direct_function_implementation its calling that folder and by default __init__.py gets called, its referring that code. Hence its calling function addnumbers() from __init__.py of addition_by_direct_function_implementation sub folder.

Class Usage

Project Name: addition_by_class_usage Inside this project, create one more subfolder with the same name and one python file main.py. Inside the subfolder create one python file __init__.py

Explanation: We will test our code in main.py, __init__.py is the python script that will run by default when we call our package from the project folder.

Your file structure should look something like this.

image.png

__init__.py: Writing a class and within that class, we are creating 2 functions for multiplying and adding the numbers in the data structure.

class addition():

    def addthenumbers(self,numbersdatastructure):
        self.numbersdatastructure = numbersdatastructure
        add=0
        for i in self.numbersdatastructure:
            add+=i
        return add

    def multiplythenumbers(self,numbersdatastructure):
        self.numbersdatastructure = numbersdatastructure
        mul=1
        for i in self.numbersdatastructure:
            mul*=i
        return mul

Here the self keyword is referring to the variable of current function.

Now our function-based package is ready, let's test on our local system. main.py

import addition_by_class_usage as acu
objectOfClass = acu.addition()
addition = objectOfClass.addthenumbers([1,2,3,4,5])
multiply = objectOfClass.multiplythenumbers([1,2,3,4,5])
print(addition,"\n",multiply)

First I am importing the packing (here package name is project folder name with __init__.py and to make its usage easy in the code, I'll call it as acu. Then I am creating object of class acu and then calling then simply functions

Through Function of Class

Project Name: functions_in_class Inside this project, create one more subfolder with the same name and one python file main.py. Inside the subfolder create one python file __init__.py

Explanation: We will test our code in main.py, __init__.py is the python script that will run by default when we call our package from the project folder.

Your file structure should look something like this.

image.png

__init__.py


class addition():

    def addthenumbers(self,numbersdatastructure):
        self.numbersdatastructure = numbersdatastructure
        add=0
        for i in self.numbersdatastructure:
            add+=i
        return add

    def multiplythenumbers(self,numbersdatastructure):
        self.numbersdatastructure = numbersdatastructure
        mul=1
        for i in self.numbersdatastructure:
            mul*=i
        return mul


def main():
    print("Main function called")


if __name__ == "__main__":
    main()

Here we have defined additional function main() and in that function I am just printing a statement.

main.py

import functions_in_class as acu
from functions_in_class import main

objectOfClass = acu.addition()

addition = objectOfClass.addthenumbers([1,2,3,4,5])
multiply = objectOfClass.multiplythenumbers([1,2,3,4,5])
print(addition,"\n",multiply)
main()

Now we are calling the function main() from the class functions_in_class. Here it will ignore the class and directly call the function.

Through the external class of package

Here the import syntax is just like direct function implementation, but instead of function, we are calling a python file that have the code. For example

from packagename import classname

Here packagename is the name of folder and classname is another python file in the folder other than __init__.py

For any queries, feel free to ask in comments or contact me over email

Publishing Python Package

So now, we are ready with our package, lets publish. We'll be publishing on test pypi.org because this is only for testing purposes.

Create Liscence.txt file : Refrence : https://choosealicense.com/
Create README.md : Reference : https://dillinger.io/
Create setup.py and add the following code. Replace with your own details Reference : geekforgeeks.org

import setuptools

with open("README.md", "r") as fh:
    long_description = fh.read()

setuptools.setup(
    # Here is the module name.
    name="addition_by_class_usage",

    # version of the module
    version="0.0.1",

    # Name of Author
    author="Lakshay Kumar",

    # your Email address
    author_email="contact@lakshaykumar.tech",

    # #Small Description about module
    # description="adding number",

    # long_description=long_description,

    # Specifying that we are using markdown file for description
    long_description=long_description,
    long_description_content_type="text/markdown",




    # if module has dependencies i.e. if your package rely on other package at pypi.org
    # then you must add there, in order to download every requirement of package
     install_requires=[ ],
#Write packages that needs to be preinstalled for using this package.


    license="MIT",

    # classifiers like program is suitable for python3, just leave as it is.
    classifiers=[
        "Programming Language :: Python :: 3",
        "License :: OSI Approved :: MIT License",
        "Operating System :: OS Independent",
    ],
)

Your folder structure should look like this.

image.png

Now to install a package called twine using this line -

pip install twine

Then

python setup.py bdist_wheel

You'll see more folders like this

image.png

Upload to test env.

twine upload -r testpypi dist/*

image.png

Woohoo! You finally uploaded it to the test environment. To upload in production environment, use this command

twine upload dist/*

You'll see your project link at the bottom

Test

To test, go to project link and copy the pip command. In my case its -
pip install -i https://test.pypi.org/simple/ addition-by-class-usage

And install in your project.

Update

To update make changes in your code and It is important to make changes in the version number. Then you can use the build and upload again to make changes.

That's it. For any queries, feel free to comment or contact me over email. Don't forget to subscribe on my website - lakshaykumar.tech