function run from a program in a different directory can no longer find its file
我使用的是python 3.6.0,在跨几个目录的项目中遇到了问题。目录结构如下:
1 2
| /project
/project/frontend |
我的前端的所有功能都在本地完成和测试,并位于/project/frontend中,现在我想将其与我的后端连接,后者位于/project中。
所以我改成了/project/frontend,运行display_page.py,其中包含行:
1 2
| sys.path.append('../')
from text_algorithms import process_text |
..其中,text_algorithms.py位于/project中,从那里运行时运行良好。因此,它开始运行了30秒,然后崩溃了,它抱怨说它找不到位于/project中的pickle文件。当运行text_algorithms.py或从/projecttext_algorithms.py中导入时,没有问题。
1 2
| with open('english_vocab.pickle', 'rb') as f:
v = pickle.load(f) |
所以我想我可以通过从下面的目录运行python frontend/display_page.py来"愚弄"它,但这产生了一个不同的错误,即,
1
| ModuleNotFoundError: No module named 'text_algorithms' |
有人知道怎么修理这个吗?-如何确保它不会根据您从何处调用而更改查找该文件的位置。有没有适当的方法来处理这种情况?
它应该在运行它的任何地方找到它的文件。
- 在根目录及其所有子目录中是否有__init__.py?
- 我在python 3.3+stackoverflow.com/questions/37139786/…中看到您不需要这样做。
- 如果要使用sys.path黑客,那么不要使用相对路径:sys.path.append('../')。您可能应该将根目录添加到PATH环境变量中。可能在虚拟环境中。
- 谢谢,我不知道这是一个黑客,你还应该如何从另一个目录中的文件导入函数?看起来我找到了一个解决方案,读一下绝对路径,然后用os.chdir来解决,但是如果我用一个黑客来取消另一个黑客。
- @我不得不在这里加上这条长得离谱的线sys.path.append(os.path.join(os.path.dirname(os.path.realpath(__file__)), os.pardir)),这样相对路径的东西就不会那么简单了。
- "豆蔻"。这就是为什么您应该将根目录添加到路径变量中的原因。
您应该在您的项目中使用cx1〔0〕其他模块:
1
| from frontend.text_algorithms import process_text |
如果在text_algorithms中,您希望访问与此模块相关的文件,那么应该使用__file__的值,该值包含到特定模块的文件路径。使用os.path可以获取目录并将其与数据文件路径连接。
例如:
1 2 3 4
| file_path = os.path.join(
os.path.split(__file__)[0],
'some.file'
) |
- 谢谢,我也在考虑用os.path和__file__来修复它,测试一下。
- 是的,很有效,谢谢。为什么我花了49分钟才让它工作……我不认为你的带点的进口声明与import..from方法不同,但正是下面目录文件中的4行os.path.join...做到了这一点。我希望你写了一些像dictionary_file =这样的东西,我花了一段时间才意识到这4行并没有改变路径,只是创建了一个字符串,其中包含文件的正确路径,无论从何处调用。