I have the following structure:
AXBot:
__init__.py
bot.py
util.py
settings.py
creator
__init__.py
xbot.py
The problem is that I cannot import the 'util' module in 'xbot.py' because python ends with 'ImportError: No module named util'... how can I solve?
PS: I am using the following code to import:
import util
import settings
Thank you.
4 Answers 4
It seems you're trying to run xbot.py from within the creator folder.
This is the output I get with xbot.py containing import util:
C:\Users\Luke\Python stuff\AXBot\creator>xbot.py
Traceback (most recent call last):
File "C:\Users\Luke\Python stuff\AXBot\creator\xbot.py", line 4, in <module>
import util
ImportError: No module named util
This is the output I get with xbot.py containing from . import util
C:\Users\Luke\Python stuff\AXBot\creator>xbot.py
Traceback (most recent call last):
File "C:\Users\Luke\Python stuff\AXBot\creator\xbot.py", line 3, in <module>
from . import util
ValueError: Attempted relative import in non-package
I also get this latter error with from .. import util instead of from . import util.
If you're running xbot.py from the directory containing it, Python can't tell that it's being run inside a package hierarchy. It thinks xbot.py isn't inside a package.
I replaced the line that attempted to import util with from AXBot import util, moved up a couple of directories and ran xbot.py using Python's -m command-line switch, which tells Python to run a module specified by module name instead of filename. Note that when you use -m, you pass in the fully-qualified name of the module, including the package hierarchy, but you don't include the file extension .py, because that's not part of the name of the module:
C:\Users\Luke\Python stuff\AXBot\creator>cd ..\..
C:\Users\Luke\Python stuff>python -m AXBot.creator.xbot
1232
I got the same output if I used import AXBot.util as util instead of from AXBot import util.
(I don't have your code to run, so instead I put a variable in util.py and attempted to print its value from within xbot.py. The value of this variable was 1232.)
3 Comments
__file__ contains the filename of the script running. Use os.path.dirname on that to get the directory your script running out of, and use os.path.join to append the names of your files to this directory. See docs.python.org/library/os.path.html.from . import util
from . import settings
I would recomment changing your folder hierarchy though, that looks cleaner to me. Also check your PYTHONPATH, it should normally work the way you did it.
References:
Try to stay away from sys.path hacks.
4 Comments
python xbot.py. Instead, use it as a package is meant to be used: run it on a script outside the AXBot directory, and do from AXBot.creator import xbot. Also, @tehmisvh: don't you mean from .. import utils?.. doesn't work either. It gives the same error as in hkproj's comment.from AXBot.creator import xbot. Running python xbot.py will always cause that problem.I think the namespacing is incorrect. From xbot.py, try using this import command
from AXBot import util
from AXBot import settings
1 Comment
where you are is the most important question! according to that, you use the import. please update your question
sys.pathfor modules to import, and there simply is no module util in the AXBot.creator package. Useimport AXBot.settings as settingsorfrom AXBot import settings