633

Set_up: I have a .py file for each function I need to use in a program.

In this program, I need to call the function from the external files.

I've tried:

from file.py import function(a,b)

But I get the error:

ImportError: No module named 'file.py'; file is not a package

How do I fix this problem?

martineau
  • 99,260
  • 22
  • 139
  • 249
user2977230
  • 6,993
  • 4
  • 12
  • 8
  • 81
    `from file import function`. No need for file extensions or function parameters – samrap Dec 01 '13 at 06:35
  • 6
    You should probably go through the [modules section](http://docs.python.org/2/tutorial/modules.html) in the Python tutorial. – Burhan Khalid Dec 01 '13 at 06:51
  • Just make sure if using PyCharms, then it would only recognize an underscore delimited filename. – Jerry Ajay Jan 10 '17 at 19:16
  • Also if you want to import the function from the `file.py`, make sure there is no package in your directory with the name `file`. – SomeBruh Apr 23 '20 at 00:04

17 Answers17

690

There isn't any need to add file.py while importing. Just write from file import function, and then call the function using function(a, b). The reason why this may not work, is because file is one of Python's core modules, so I suggest you change the name of your file.

Note that if you're trying to import functions from a.py to a file called b.py, you will need to make sure that a.py and b.py are in the same directory.

Peter Mortensen
  • 28,342
  • 21
  • 95
  • 123
Games Brainiac
  • 71,327
  • 31
  • 126
  • 185
  • 7
    The "file" was just a placeholder for the question I am asking, not the actual file name. Thank you though. I will try this and get back to you. – user2977230 Dec 01 '13 at 06:37
  • 8
    I tried this, but it is still showing the error: Has it got anything to do with Python 3, or is a general problem? – DarkRose Jun 29 '15 at 07:02
  • 9
    @GamesBrainiac, what if the file you want to import functions from is in a different directory? Can I include the filepath preceeding the filename, or is there something more complicated? – Tom Apr 27 '16 at 01:14
  • 10
    @Tom You have to add that path to the PYTHONPATH variable if it is not already in there. – Games Brainiac Apr 27 '16 at 12:20
  • 20
    Is there a way to import functions from a.py to a file b.py if they are not in the same directory? – Nirvan Sengupta Sep 27 '16 at 22:50
  • newbies try "import file", which should execute only once (singleton) – Jason May 14 '17 at 02:22
  • Do you have to import all dependencies from `file` that are used in `function` as well? – quantik Jul 05 '17 at 21:03
  • In Python 2 it looks like this either (a) executes the entire script you're referencing with `from foo import ...` or (b) does not work if `foo.py` has references to the `argparse` library. – alex Mar 01 '18 at 16:50
  • @DarkRose Same for me, I fixed it by changing the order of the imports within __init__.py file, making sure root dependencies were loaded after their transitive dependencies. – nuKs Apr 07 '21 at 06:21
240

First of all you do not need a .py.

If you have a file a.py and inside you have some functions:

def b():
  # Something
  return 1

def c():
  # Something
  return 2

And you want to import them in z.py you have to write

from a import b, c
Peter Mortensen
  • 28,342
  • 21
  • 95
  • 123
Salvador Dali
  • 182,715
  • 129
  • 638
  • 708
79

You can do this in 2 ways. First is just to import the specific function you want from file.py. To do this use

from file import function

Another way is to import the entire file

import file as fl

Then you can call any function inside file.py using

fl.function(a,b)
Pulkit Bansal
  • 983
  • 7
  • 11
62

If your file is in the different package structure and you want to call it from a different package, then you can call it in that fashion:

Let's say you have following package structure in your python project:

Python package and file structure

in - com.my.func.DifferentFunction python file you have some function, like:

def add(arg1, arg2):
    return arg1 + arg2

def sub(arg1, arg2) :
    return arg1 - arg2

def mul(arg1, arg2) :
    return arg1 * arg2

And you want to call different functions from Example3.py, then following way you can do it:

Define import statement in Example3.py - file for import all function

from com.my.func.DifferentFunction import *

or define each function name which you want to import

from com.my.func.DifferentFunction import add, sub, mul

Then in Example3.py you can call function for execute:

num1 = 20
num2 = 10

print("\n add : ", add(num1,num2))
print("\n sub : ", sub(num1,num2))
print("\n mul : ", mul(num1,num2))

Output:

 add :  30

 sub :  10

 mul :  200
abanmitra
  • 861
  • 8
  • 6
45

You can call the function from a different directory as well, in case you cannot or do not want to have the function in the same directory you are working. You can do this in two ways (perhaps there are more alternatives, but these are the ones that have worked for me).

Alternative 1 Temporarily change your working directory

import os

os.chdir("**Put here the directory where you have the file with your function**")

from file import function

os.chdir("**Put here the directory where you were working**")

Alternative 2 Add the directory where you have your function to sys.path

import sys

sys.path.append("**Put here the directory where you have the file with your function**")

from file import function
Juan Ossa
  • 923
  • 1
  • 8
  • 12
28

Came across the same feature but I had to do the below to make it work.

If you are seeing 'ModuleNotFoundError: No module named', you probably need the dot(.) in front of the filename as below;

from .file import funtion

Ricky Boy
  • 533
  • 5
  • 7
21

Functions from .py file (can (of course) be in different directory) can be simply imported by writing directories first and then the file name without .py extension:

from directory_name.file_name import function_name

And later be used: function_name()

Weky
  • 320
  • 5
  • 4
14

Rename the module to something other than 'file'.

Then also be sure when you are calling the function that:

1)if you are importing the entire module, you reiterate the module name when calling it:

import module
module.function_name()

or

import pizza
pizza.pizza_function()

2)or if you are importing specific functions, functions with an alias, or all functions using *, you don't reiterate the module name:

from pizza import pizza_function
pizza_function()

or

from pizza import pizza_function as pf
pf()

or

from pizza import *
pizza_function()
misterrodger
  • 161
  • 1
  • 7
13

First save the file in .py format (for example, my_example.py). And if that file have functions,

def xyz():

        --------

        --------

def abc():

        --------

        --------

In the calling function you just have to type the below lines.

file_name: my_example2.py

============================

import my_example.py


a = my_example.xyz()

b = my_example.abc()

============================

Peter Mortensen
  • 28,342
  • 21
  • 95
  • 123
Nagaraj Simpi
  • 131
  • 1
  • 5
  • 2
    I don't know if my fail is about python versions. What i do choosing this example is `import fn` (without extension) and using them directly on the main file `fn.my_funcion()`. When i use `import fn.py` tries to load py.py file, wich doesn't exist. Using `from fn.py import funcname` didn't work too. Thank you. – m3nda Jun 09 '15 at 04:01
9

Inside MathMethod.Py.

def Add(a,b):
   return a+b 

def subtract(a,b):
  return a-b

Inside Main.Py

import MathMethod as MM 
  print(MM.Add(200,1000))

Output:1200

Mahabubuzzaman
  • 319
  • 3
  • 3
6

You don't have to add file.py.

Just keep the file in the same location with the file from where you want to import it. Then just import your functions:

from file import a, b
Peter Mortensen
  • 28,342
  • 21
  • 95
  • 123
Mohan
  • 135
  • 2
  • 7
5

You should have the file at the same location as that of the Python files you are trying to import. Also 'from file import function' is enough.

Peter Mortensen
  • 28,342
  • 21
  • 95
  • 123
Girish M
  • 69
  • 1
  • 2
5

append a dot . in front of a file name if you want to import this file which is in the same directory where you are running your code.

For example, I'm running a file named a.py and I want to import a method named addFun which is written in b.py, and b.py is there in the same directory

from .b import addFun
JoSSte
  • 2,210
  • 5
  • 25
  • 40
Shravan Kumar
  • 181
  • 1
  • 2
  • 5
4

Any of the above solutions didn't work for me. I got ModuleNotFoundError: No module named whtever error. So my solution was importing like below

from . import filename # without .py  

inside my first file I have defined function fun like below

# file name is firstFile.py
def fun():
  print('this is fun')

inside the second file lets say I want to call the function fun

from . import firstFile

def secondFunc():
   firstFile.fun() # calling `fun` from the first file

secondFunc() # calling the function `secondFunc` 
NuOne
  • 4,218
  • 1
  • 27
  • 39
2

Suppose the file you want to call is anotherfile.py and the method you want to call is method1, then first import the file and then the method

from anotherfile import method1

if method1 is part of a class, let the class be class1, then

from anotherfile import class1

then create an object of class1, suppose the object name is ob1, then

ob1 = class1()
ob1.method1()
Amir Md Amiruzzaman
  • 1,653
  • 21
  • 22
2

in my case i named my file helper.scrap.py and couldn't make it work until i changed to helper.py

bresleveloper
  • 5,430
  • 3
  • 31
  • 45
1

in my main script detectiveROB.py file i need call passGen function which generate password hash and that functions is under modules\passwordGen.py

The quickest and easiest solution for me is

Below is my directory structure

enter image description here

So in detectiveROB.py i have import my function with below syntax

from modules.passwordGen import passGen

enter image description here

Mansur Ali
  • 1,468
  • 16
  • 14