【问题标题】:In python, how to import filename starts with a number在python中,如何导入文件名以数字开头
【发布时间】:2012-02-23 19:03:31
【问题描述】:

基本上有一个名为8puzzle.py 的文件,我想将该文件导入另一个文件(在同一个文件夹中,因为提供了文件,所以我无法更改文件名)。无论如何在Python中可以做到这一点?我尝试了通常的方式from 8puzzle import *,它给了我一个错误。

错误是:

>>> import 8puzzle
  File "<input>", line 1
    import 8puzzle
           ^
SyntaxError: invalid syntax
>>> 

【问题讨论】:

  • 为什么人们说“它给了我[一个]错误”然后不发布错误是什么?
  • @JohnZwinck 这是一个语法错误。我猜是因为“8puzzle”不是一个有效的标识符(它以数字开头),并且 import 语句的语法需要一个 Python 标识符。这将使答案“不,你不能。将模块重命名为以字母或下划线开头的东西。”
  • 约翰说得很好,我会记住的。并感谢 Abhijeet 为我添加错误消息。谢谢。
  • 将8puzzle.py 重命名为puzzle8.py 并使用import puzzle8。

标签: python import


【解决方案1】:

你可以的

puzzle = __import__('8puzzle')

非常有趣的问题。我会记住不要用数字命名任何东西。

如果你想import * -- 你应该check out this question and answer。

【讨论】:

  • 效果很好!谢谢。是的,我不会以数字开头命名它,但它是一个课程作业讲义文件,所以我不能更改名称。但这似乎并不重要,因为我们已经找到了解决方案。再次感谢。
  • 帮助拯救世界,或至少拯救你的同学。如果您收到了一个不可能的导入,请将其引起教师的注意。是的,有时他们讨厌犯错,但如果你遇到这个问题,其他人也会遇到这个问题,虽然这个答案有效,但它不是正确的解决方案(除非课程是“Obfuscated Python 101”)。
  • 更好的方法(至少使用 python 2.7)是使用 'importlib' 模块:puzzle = importlib.import_module('8puzzle')
  • 实际上有一个很好的用例 - 作为编译/生产过程的一部分,如果它们以字典形式命名,则将 python 模块连接在一起是最简单的(通常没关系,但常量和import 在顶部,'if name' 在底部,所以一些以 '0' 开头的模块可能很有用。)当与 inotify 或 watch 结合使用时,在调试这种不寻常的目录布局时也很有用,例如: watch -n .1 'cat * | python',它将每十分之一秒(或至少尽可能快)加载您的 python 应用程序,或者: cat $(find . -name "*.py") |蟒蛇
  • 迟到了,但另一个用例是从 Alembic 迁移中导入,因为它们都以随机哈希开始
【解决方案2】:

以上答案都是正确的,但就目前而言,推荐的方式是使用import_module函数:

importlib.import_module(name, package=None)
导入一个模块。名字 参数指定要以绝对或相对术语导入的模块 (例如pkg.mod 或..mod)。如果名称是相对指定的 条款,那么包参数必须设置为 包作为解析包名的锚 (例如import_module('..mod', 'pkg.subpkg') 将导入pkg.mod)。

import_module() 函数充当简化包装 importlib.__import__()。这意味着函数的所有语义都是 源自importlib.__import__()。最重要的区别 这两个函数之间是import_module() 返回 指定的包或模块(例如pkg.mod),而__import__() 返回 顶级包或模块(例如pkg)。

如果您要动态导入自 解释器开始执行(例如,创建了一个 Python 源文件),你 可能需要调用 invalidate_caches() 才能使新模块 导入系统注意到了。

__import__ 现在不推荐了。

importlib.__import__(name, globals=None, locals=None, fromlist=(), level=0)
内置__import__()函数的实现。

注意模块的程序化导入应该使用import_module()而不是这个函数。

【讨论】:

  • 谢谢,它确实有效,但在其中一个以数字开头的文件中导入函数或变量不起作用。如果我这样做:an_imported_file = importlib.import_module('13_file'),那么我不能这样做from an_imported_file import var_x。有什么办法可以做到这一点?
  • /usr/local/bin/python3.7 "/Users/constan/Desktop/2_COData/1_PYTHON /CODEX/13_Spacy/children.py" Traceback (most recent call last): File "/Users/constan/Desktop/2_COData/1_PYTHON /CODEX/13_Spacy/children.py", line 7, in &lt;module&gt; from an_imported_file import var_x ModuleNotFoundError: No module named 'an_imported_file'
  • 另外,Pycharm 中的 ` from an_imported_file import var_x ` 行带有红色下划线...
  • 我不知道对不起。我的一般建议是避免这样做。
  • @Martin 只需使用 an_imported_file.var_x
【解决方案3】:

不要在您的导入中使用 .py 扩展名。

from 8puzzle import * 有效吗?

不管怎样,from x import * 并不是首选的 Python 模式,因为它会将模块的命名空间渗入您当前的上下文中。

一般来说,尝试从该模块导入您特别需要的东西。可以导入来自其他模块的任何全局变量。

例如,如果您有 8puzzle.foo,您可以执行 `from 8puzzle import

编辑:

虽然我的.py 消息是正确的,但这还不够。

另一位发帖人__import__('8puzzle') 的建议是正确的。但是,我强烈建议避免使用这种模式。

一方面,它保留了一个内部的、私有的 Python 方法。 您基本上打破了能够导入模块意味着什么的基本假设。只需将文件重命名为其他名称,例如 puzzle8,就可以解决这个问题。

这会让经验丰富的 Python 程序员感到沮丧,他们希望知道您的导入在顶部是什么,并希望代码(尝试)符合 PEP8。

【讨论】:

  • 抱歉让您感到困惑。我所做的是from 8puzzle import *,我编辑了我原来的问题。而且它不像 mvanveen 所说的那样工作。
  • 那是我的错。我忘记了模块文件名不能以数字开头。我已经发布了一个编辑。
【解决方案4】:

文件目录结构如下:

 daily
   -- 20210504
         permutations.py
         __init__.py
   __init__.py

您可以通过__import__ 或importlib.import_module 导入permutations 模块。

官方文档推荐使用importlib.import_module。

import(name, globals=None, locals=None, fromlist=(), level=0) -> 模块

导入一个模块。因为这个函数是供 Python 解释器使用的,而不是一般用途,所以最好 useimportlib.import_module()以编程方式导入模块。

有什么区别?

如果使用__import__ 实现。 例如:

res = __import__('daily.20210504.permutations')

res 的结果是日常模块。

所以,如果要获取permutations模块,需要提供fromlist参数,写法如下。

res = __import__('daily.20210504.permutations', fromlist=('daily.20210504'))

现在可以看到 res 的结果为 这是正确的结果。

如果我使用importlib.import_module 会怎样?

res = importlib.import_module('daily.20210504.permutations')

这允许您直接获取permutations 模块。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多