我是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文件?
当您将其编译成机器码时,它会将目录路径硬编码到源文件。
要使编译后的文件工作,你所需要做的就是把它们移到未编译版本所在的目录下。