首页 文章

如何在python shell中的virtualenv中导入包

提问于
浏览
1

我正在尝试创建一个功能来定期向用户发送通知,尤其是ios移动设备 .

具体来说,我使用pythonanywhere的'Scheduled task' . (https://help.pythonanywhere.com/pages/ScheduledTasks

这是我发送通知的脚本 .

#!/usr/local/bin/python3.4
import sys,os,django
sys.path.append("/home/lkm/Folder/project/")
sys.path.append("/home/lkm/Folder/project/app/myvenv/")
print(sys.path)
os.environ["DJANGO_SETTINGS_MODULE"] = "project.settings"
from push_notifications.models import APNSDevice, GCMDevice
device = APNSDevice.objects.all()
if device is None:
    print('No Device')
message = 'Home Fried Potatoes, Yo-nola Bar, Soup du Jour, More...'
device.send_message(message)

但是在 'from push_notifications.models import APNSDevice, GCMDevice' 的行上我收到了一个错误:

'ImportError:没有名为'push_notifications'的模块

I think it's because of not importing virtualenv because push_notifications package is inside of packages of virtualenv, in mycase 'myvenv' directory.

但即使我通过'ImportError导入'myvenv':没有名为'push_notifications'的模块 .

它会产生同样的错误,你有解决方案吗?

UPDATE (First script , second error message)

#!/home/lkm/folder/project/app/myvenv/bin/python
import sys,os,django
sys.path.append("/home/lkm/folder/project/application/myvenv/bin/../lib/python/site-packages")
print(sys.path)
os.environ["DJANGO_SETTINGS_MODULE"] = "project.settings"
from push_notifications.models import APNSDevice, GCMDevice
device = APNSDevice.objects.all()
if device is None:
    print('No Device')
message = 'Home Fried Potatoes, Yo-nola Bar, Soup du Jour, More...'
device.send_message(message)

['/ home / lkm / folder / project / application','/ usr / lib / python3.4','/ usr / lib / python3.4 / plat-x86_64-linux_gnu','/ usr / lib /python3.4/lib-dynload','/ usr / local / lib / python3.4 / record-packages','/ usr / lib / python3 / dist-packages','/ home / lkm / folder / project / application / myvenv / bin /../ lib / python / site-packages'] Traceback(最近一次调用最后一次):文件“/home/lkm/folder/project/application/schedule.py”,第9行,来自push_notifications .models导入APNSDevice,GCMDevice ImportError:没有名为'push_notifications'的模块

2 回答

  • 2

    我会改变shebang来使用你的虚拟环境中的Python .

    #!/home/lkm/Folder/project/app/myvenv/bin/python
    

    然后,您不必将虚拟环境附加到python路径,并且可以删除以下行 .

    sys.path.append("/home/lkm/Folder/project/app/myvenv/")
    

    但是,如果您真的想要将虚拟env目录手动添加到Python路径,那么我认为您希望包含site-packages目录:

    sys.path.append("/home/lkm/Folder/project/app/myvenv/python3.4/site-packages")
    
  • 0

    你是如何执行该文件的?我看到你有:

    #!/usr/local/bin/python3.4
    

    这意味着如果你正在执行文件:

    ./file.py
    

    它将与系统解释器一起执行 .

    您需要激活环境:

    $ source env/bin/activate
    

    并执行以下文件:

    $ python file.py
    

    FWIW,我认为最干净的解决方案是为你的项目设置一个setup.py scriptpackages= 参数是最重要的)并定义一个entry point,类似于:

    entry_points = {
        'console_scripts': ['my-script=my_package.my_module:main'],
    }
    

    然后在激活环境后运行 python setup.py develop ,您只需将脚本作为命令运行:

    $ my-script
    

相关问题