gpt4 book ai didi

python - 为什么从 setup.py 调用 Python 脚本会调用 Python shell?

转载 作者:太空宇宙 更新时间:2023-11-03 18:45:13 24 4
gpt4 key购买 nike

我尝试在安装过程中使用自定义安装从 setup.py 调用 Python 脚本:

class CustomInstall(install):
def run(self):
install.run(self)

...

p = subprocess.Popen(
[sys.executable, 'demo_package/deploy_database.py'],
shell=True,
stdout=subprocess.PIPE,
cwd=os.path.join(self.install_lib, 'demo_package'))

out, err = p.communicate()

setup(..., cmdclass=dict(install=CustomInstall))

在 Ubuntu 计算机上部署包时,该过程没有执行deploy_database.py,而是没有显示任何内容。当我使用 Ctrl+C 手动停止它时,输出似乎表明它没有实际运行deploy_database.py,而是只是启动了Python:

^CDownloading/unpacking PypiPackagesMonitoring
Downloading demo-1.0.64.zip
Running setup.py egg_info for package demo

Installing collected packages: demo
Running setup.py install for demo

Python 3.3.2+ (default, Oct 9 2013, 14:50:09)
[GCC 4.8.1 on linux
Type "help", "copyright", "credits" or "license" for more information.
Cleaning up...
Operation cancelled by the user
Storing complete log in /home/.../.pip/pip.log

我调用 Python 脚本的方式有什么问题?我该怎么做呢?

最佳答案

shell=True 不需要与 [sys.executable, 'demo_package/deploy_database.py'] 一起使用,并且会导致问题。您执行此操作的方式(如果省略 shell=True)是首选方式,因为它绕过了 shell。

shell=True 使 Popen 将传递的命令移交给 shell(例如 /bin/bash,具体取决于为当前用户配置的 shell)。仅执行列表中传递的第一个命令,列表中的其他元素作为参数传递给 shell 本身(来自 docs ):

On Unix with shell=True […] If args is a sequence, the first item specifies the command string, and any additional items will be treated as additional arguments to the shell itself.

shell=True 有 pip 危险,但在某些情况下也很有用。请参阅the documentation了解详情。

关于python - 为什么从 setup.py 调用 Python 脚本会调用 Python shell?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19691754/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com