我是Python(3.3.2)的新手,我使用
的经验很少 from .... import ....
超出time
,turtle
和math
的使用范围。我正在研究几个Project Euler问题,这些问题需要一个函数来使用我的简单isPrime(n)函数来确定数字的素数。 isPrime(n)函数是名为isPrime.py的文件中唯一的函数。
我为每个Project Euler问题都有一个单独的文件夹我试图保持代码的正确但我发现直接从isPrime.py复制我的isPrime(n)函数并将其粘贴到其中的每个新文件中都不方便专门针对每个问题的文件夹。我有一些关于改进我的isPrime(n)函数的想法,并且我不想打开几个问题文件夹,只是为了在我做一些修改时更改每个文件中的行。
所以我认为在每个问题文件的顶部写下面这行都可以了:
from isPrime.py import isPrime
甚至from isPrime import isPrime
但是,我两种方式都遇到以下错误:
ImportError: No module named 'isPrime'
以下是我的文件夹层次结构的基本描述:
我的问题是:
我需要输入文件problemX.py
,problemY.py
和problemZ.py
的开头行以使用文件{{1}中的函数isPrime(n)
在文件夹isPrime.py
?
我已经在stackoverflow上搜索了很长时间,我发现许多问题与Python有关,导入文件/模块有困难。但是,我不了解系统路径是什么,或者相对导入是什么,我不知道发现的Python文档here告诉我什么。 请不要将此问题标记为此处已有的许多Python /导入问题的副本。所有我正在寻找的是一个简单的1-3行代码放在我的文件的顶部,这样我就可以从其他文件夹中导入我的功能,并且不必复制 - 和 - 每次尝试新问题时粘贴我的功能。我会非常感谢最简单的答案。谢谢!
答案 0 :(得分:2)
由于您希望将要导入的模块保存在不同的目录中,您可以通过将这些目录添加到sys.path来告诉python在哪里找到它们:
from sys import path
path.append('fully specified path name of directory with module you want to import')
from mymodule import myfunction
如果isPrime.py与导入它的程序位于同一文件夹中,则不需要这样做,但有时这是不切实际的。
虽然模块与其中一个函数具有相同的名称并不是最佳选择,但我会考虑更改它。
答案 1 :(得分:2)
我遇到了和你一样的问题,即我有一些实用程序模块可能对解决多个项目euler问题很有用,每个项目的euler问题都有自己的目录。
最初我将实用程序文件夹放入sys.path
作为@user3114046 suggested:
import sys; sys.path.insert(0, '../Primality Functions Folder')
from isPrime import isPrime
感觉很脏但是有效(注意:我甚至在这里使用了相对路径!)。
作为替代方案,您可以在与isPrime.py
相同的目录中创建simple setup.py
file:
from distutils.core import setup
NAME = 'isPrime'
setup(name=NAME, version='0.0.1', py_modules=[NAME])
并安装实用程序模块:
$ python setup.py install
之后你可以在任何脚本中使用它:
from isPrime import isPrime
如果您想使用多个实用程序模块;您可以将它们放入project_euler_utils
目录并将其安装为Python包。将setup.py
放在project_euler_utils
目录旁边:
from distutils.core import setup
NAME = 'project_euler_utils'
setup(name=NAME, version='0.0.1', packages=[NAME])
运行pip install project_euler_utils
,进行安装。之后;你可以在任何脚本/模块中使用它:
from project_euler_utils.isprime import isprime
注意:我使用小写名称pep-8 suggests(您需要重命名模块及其中的函数)。
我尝试使用
"C:\Users\Owner\Documents\Primality Functions Folder"
时能想到的最完整的路径,它给了我一个Syntax Error: (unicode error) 'unicodeescape' codec can't decode bytes in position 2-3: truncated \UXXXXXXXX escape.
对Windows路径r'C:\Users\Owner...'
使用原始字符串文字(注意:r''
前缀)否则反斜杠在文字字符串中是特殊的,特别是u'\U0001F385'
不是10个字符;它是single Unicode codepoint U+1F385
。