编译后如何使python导入工作?



我是python编译的新手,我尝试在安装miniconda时使用python 3.9编译脚本。

这是我的main.py在我的项目根文件夹。

from say_hello import just_say_hello
print('Hi')
just_say_hello()

这里是say_hello.py


def just_say_hello():
print('Hello')

文件在同一个文件夹中。在该文件夹中,我运行以下命令行语句进行编译:

python -m compileall . 

之后,我运行以下命令行语句:

cd __pycache__
python .main.cpython-39.pyc

这会导致以下错误:

ModuleNotFoundError: No module named 'say_hello'

为什么从__pycache__文件夹运行脚本时找不到此模块?两个脚本文件(编译)都在那里。这应该不是一个大问题。当运行正常的原始脚本时,一切正常。当使用pycompile时,事情突然中断了。但是,我真的需要编译。

我怎么才能编译这个python脚本,这样我就可以运行它没有这样的问题?

我尝试了几种方法。例如,我将pyc文件重命名为普通的python文件。跑后

python main.py

我收到以下错误:

ValueError:源代码字符串不能包含空字节

所以我真的需要一个解决方案来运行我编译的多文件脚本。

Python是一种解释性语言,这意味着您不必编译脚本来运行它们(尽管它们在技术上仍然是编译的)。这意味着当你运行一个python文件时,它被编译成字节码(机器码),然后运行。但是,如果在您正在运行的文件中引用了其他python文件,则会对它们进行编译,以便在调用它们时不必对它们进行编译,这就是.pyc文件。我不建议删除它们。我希望这对你有帮助。

模块导入是Python的众多错误之一,就像重要的空白一样,'Python'似乎对此感到自豪。

话虽如此,我通常通过将所有内容添加到PYTHONPATH来解决导入问题。在环境变量中(取决于操作系统)或在代码本身中使用sys.path.append('..')

当您重新启动或将应用程序移动到不同的机器甚至不同的目录时,预计会出现新的问题。或者当你想让你的应用程序跨平台时。

仔细测试这些场景。

p。这里还有一个比较老的答案,解释了不同的导入方式:我如何导入其他Python文件?

当您将其编译成机器码时,它会将目录路径硬编码到源文件。

要使编译后的文件工作,你所需要做的就是把它们移到未编译版本所在的目录下。

最新更新